Jeg har en MS SQL Server 2008 R2 DB-server i øjeblikket i brug med en produktionsapp.
En ny forbedring af appen kræver nu en varchar(100)
-kolonne i en tabel, der skal øges i længden.
Kan længden af dette eksisterende kolonne i prod DB øges uden at påvirke de aktuelle data?
Skal denne ændring afsluttes uden for åbningstiden for at undgå afbrydelse af tjenesten?
Svar
Hvis du øger det til varchar(100 - 8000)
(dvs. alt andet end varchar(max)
), og du gør dette gennem TSQL snarere end SSMS GUI
ALTER TABLE YourTable ALTER COLUMN YourCol varchar(200) [NOT] NULL
og ændrer ikke kolonnens ugyldighed fra NULL
til NOT NULL
( som ville låse tabellen, mens alle rækker er valideret og potentielt skrevet til ) eller fra NOT NULL
til NULL
under nogle omstændigheder så er dette en hurtig ændring af kun metadata. Det kan være nødvendigt at vente på en SCH-M
-lås på bordet, men når den først er klar over, at ændringen vil være stort set øjeblikkelig.
En advarsel at være opmærksom på er at under ventetiden på en SCH-M
låser andre forespørgsler bliver blokeret i stedet for at springe køen foran den, så du måske overvejer at tilføje en SET LOCK_TIMEOUT
først.
Sørg også for i ALTER TABLE
udsagn, du angiver eksplicit NOT NULL
, hvis det er den oprindelige kolonnetilstand, ellers ændres kolonnen for at tillade NULL
.