Potrzebuję dodać nową kolumnę do bazy danych MS SQL 2005 z wartością początkową. Jednak NIE chcę automatycznie tworzyć domyślnego ograniczenia dla tej kolumny. W momencie dodawania kolumny wartość domyślna/początkowa jest poprawna, ale może się ona zmieniać z czasem. Dlatego przyszły dostęp do tabeli MUSI określać wartość zamiast akceptować wartość domyślną.Najlepszy sposób dodania nowej kolumny z początkową (ale nie domyślną) wartością?
Najlepszym mogłem wymyślić jest:
ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL
To wydaje się nieco nieefektywne stoły largish (100.000 do 1.000.000 rekordy).
Eksperymentowałem z dodaniem kolumny z wartością domyślną, a następnie usunięciem domyślnego ograniczenia. Jednak nie wiem, co to jest nazwa domyślnego ograniczenia i raczej nie powinien uzyskiwać dostępu do sysobjects i umieszczać w bazie wiedzy.
Proszę, musi być lepszy sposób.
+1. --- @Alex: Nie jestem pewien, czy można wykonać DDL w ramach transakcji. --- @Adrian: czy naprawdę zależy Ci na tym, że jest on nieefektywny? Nie robisz tego codziennie, prawda? Zwykle używam tego, co opisujesz dla jasności. – van
@van, nie jestem w 100% pewny ograniczeń SqlServer'05 w tym względzie - PostgreSQL pozwala ci na dokonywanie zmian w tabelach transakcyjnych (przynajmniej BEGIN i COMMIT transakcji). Aby sprawdzić, czy MS również to robi, SELECT @@ TRANCOUNT powinien powiedzieć (nie mogę znaleźć go wyraźnie w dokumentach). –
@van & @Alex MS SQL Server wykonuje DDL w ramach transakcji. –