Zmiana szerokości kolumny

39

Czy zwiększenie szerokości kolumny (nvarchar) koniecznie spowoduje upuszczenie tabeli?

Innymi słowy, czy można zmienić szerokość w środowisku produkcyjnym z aktywnymi użytkownikami?

Doszedłem do wniosku, że jeśli rozmiar rośnie (w przeciwieństwie do zmniejszania), nie stanowi to problemu.

Fernando
źródło

Odpowiedzi:

52

Jeśli robisz to za pomocą instrukcji T-SQL, takiej jak poniżej, nie nastąpi upuszczenie tabeli i możesz to bezpiecznie zrobić w środowisku produkcyjnym:

alter table <table> alter column <column> nvarchar(biggernumber) [not] null

Jeśli zrobisz to za pomocą graficznego interfejsu użytkownika tabeli projektowania SSMS, będzie to zależeć od tego, jakiego skryptu zdecyduje się użyć do wdrożenia zmiany. Czasami wstawi dane do tabeli tymczasowej, upuści oryginalną tabelę, utworzy nową wersję tej tabeli i włoży ją z powrotem do nowej. Łatwym sposobem, aby dowiedzieć się, co zrobi, jest kliknięcie przycisku „Generuj skrypt” i sprawdzenie T-SQL, który planuje uruchomić.

Derek Kromm
źródło
1
Myślałem, że nawet przycisk „Generuj skrypt” wyświetla ostrzeżenie, że masz zamiar upuścić tabelę, zanim nawet pokaże ci skrypt.
Nick Chammas
1
Zgłasza błąd, ale tak naprawdę nie uruchamia skryptu, dopóki nie klikniesz OK (lub uruchom lub cokolwiek) w oknie ze skryptem. Możesz skopiować skrypt i anulować okno pokazujące skrypt.
mrdenny
ale czy to działa, powiedzmy zmianę z liczby zmiennoprzecinkowej na dziesiętną (n, n)?
Nishanth Shaan,
Jaki to ma wpływ, jeśli tabela jest replikowana? Zakładam, że tabele abonentów nie aktualizują się automatycznie?
tmwoods,
18

Zwiększenie szerokości nvarcharkolumny nie będzie wymagało upuszczenia tabeli. Ani też żadna ALTER TABLEoperacja. Szczegółowe informacje na temat ograniczeń przy zmianie właściwości tabeli lub kolumny można znaleźć w instrukcji ALTER TABLE .

Skopiowałem najważniejsze części z poniższej dokumentacji:

Zmiana wielkości kolumny

Możesz zmienić długość, precyzję lub skalę kolumny, określając nowy rozmiar dla typu danych kolumny w klauzuli ALTER COLUMN. Jeśli dane istnieją w kolumnie, nowy rozmiar nie może być mniejszy niż maksymalny rozmiar danych. Ponadto kolumny nie można zdefiniować w indeksie, chyba że kolumna ma typ danych varchar, nvarchar lub varbinary, a indeks nie jest wynikiem ograniczenia klucza podstawowego. Zobacz przykład P.

Zamki i ZMIEŃ TABELĘ

Zmiany określone w ALTER TABLE są wdrażane natychmiast. Jeśli zmiany wymagają modyfikacji wierszy w tabeli, ALTER TABLE aktualizuje wiersze. ALTER TABLE uzyskuje blokadę modyfikacji schematu w tabeli, aby upewnić się, że żadne inne połączenia nie odwołują się nawet do metadanych tabeli podczas zmiany, z wyjątkiem operacji indeksu online, które wymagają bardzo krótkiej blokady SCH-M na końcu. W operacji ALTER TABLE… SWITCH blokada jest uzyskiwana zarówno w tabeli źródłowej, jak i docelowej. Zmiany wprowadzone w tabeli są rejestrowane i można je w pełni odzyskać. Zmiany, które wpływają na wszystkie wiersze w bardzo dużych tabelach, takie jak upuszczenie kolumny lub dodanie kolumny NOT NULL z wartością domyślną, mogą zająć dużo czasu, aby zakończyć i wygenerować wiele rekordów dziennika. Te instrukcje ALTER TABLE powinny być wykonywane z taką samą ostrożnością jak wszelkie INSERT, UPDATE,

MicSim
źródło
Również świetna odpowiedź. Ale mogłem wybrać tylko jeden. Dzięki!
Fernando