Zapisywanie zmian po edycji tabeli w SQL Server Management Studio

265

Jeśli chcę zapisać zmiany w tabeli, wcześniej zapisane w SQL Server Management Studio (brak danych w tabeli), pojawia się komunikat o błędzie:

Zapisywanie zmian jest niedozwolone. Wprowadzone zmiany wymagają usunięcia i ponownego utworzenia poniższych tabel. Dokonałeś zmian w tabeli, których nie można odtworzyć, lub włączyłeś opcję Zapobiegaj zapisywaniu zmian, które wymagają ponownego utworzenia tabeli.

Co może uniemożliwić łatwą edycję tabeli? A może jest to zwykły sposób, aby SQL Server Management Studio wymagał ponownego utworzenia tabeli do edycji? Co to jest - ta „opcja Zapobiegaj zapisywaniu zmian” ?

rem
źródło
1
@Pang - To pytanie było pierwsze, to jest duplikat.
GrandMasterFlush
@Pang - nie wiedziałem o tym, dzięki.
GrandMasterFlush

Odpowiedzi:

573

Przejdź do Narzędzia -> Opcje -> Projektanci-> Odznacz „Zapobiegaj zapisywaniu zmian wymagających ponownego utworzenia tabeli”. Voila

Dzieje się tak, ponieważ czasami trzeba upuścić i odtworzyć tabelę, aby coś zmienić. Może to chwilę potrwać, ponieważ wszystkie dane muszą zostać skopiowane do tabeli tymczasowej, a następnie ponownie wstawione do nowej tabeli. Ponieważ SQL Server domyślnie ci nie ufa, musisz powiedzieć „OK, wiem, co robię, teraz pozwól mi wykonać swoją pracę”.

Pedro
źródło
8
Witryna pomocy technicznej Microsoft odradza to, ale jeśli nie masz żadnych danych w tabeli, nie widzę szkody. Prawdopodobnie najlepiej użyć TSQL do wprowadzenia zmian.
Jon Smock
6
Osobiście odradzałbym używanie projektanta dla ważnych baz danych. Wielokrotnie widziałem, że popełnia on kosztowne błędy. Poza tym promuje leniwe nawyki programistyczne i pozwala ludziom modyfikować strukturę bazy danych, którzy mogą nie być wystarczająco biegli, aby to zrobić, jeśli nie mogą zarządzać trasą kodu SQL.
Mark W Dickson
5
Zgadzam się, Mark, ale na wczesnym etapie rozwoju nie muszę pisać stosu skryptów.
Kristopher
7
To szokujące, że jest wrzesień 2016 r., I ten niesamowity, nieprzyjazny dla użytkownika błąd (bez opcji zapytania „Hej, czy ZEZWALAJ NA ZMIANY STOŁÓW?”) Jest nadal w grze. Nie, po prostu dostajesz przycisk Anuluj i musisz ponownie wprowadzić zmiany. SQL Server w najgłupszy sposób.
Mike Gledhill
2
@ Mike Gledhill Greetings z 2019 roku i nadal tak jest w przypadku LOL
Captain Kenpachi
116

Narzędzia> Opcje

wprowadź opis zdjęcia tutaj

Odznacz powyższą opcję

Prasanna
źródło
5
Dzięki za zrzut ekranu. Szukałem czegoś takiego, aby pomóc mi znaleźć tę głupią opcję. Okno dialogowe powinno zawierać pole wyboru „zrób to mimo wszystko”, gdy jest napisane, że nie możesz.
Chris Benard
2
Najlepsza praktyka Po zmianie tej opcji jest zaznaczenie górnej opcji „Automatycznie generuj skrypty zmian”, aby zapobiec utracie danych
dubi
Dzięki za obraz. Jest to bardzo przydatne :)
M A.
72

Aby obejść ten problem, użyj instrukcji SQL, aby wprowadzić zmiany w strukturze metadanych tabeli.

Ten problem występuje, gdy włączona jest opcja „Zapobiegaj zapisywaniu zmian wymagających ponownego utworzenia tabeli” .

Źródło: Komunikat o błędzie podczas próby zapisania tabeli w SQL Server 2008: „Zapisywanie zmian jest niedozwolone”

Daniel Vassallo
źródło
12
Moje pytanie brzmi: dlaczego SQL Server nie używa wymaganych instrukcji T-SQL zamiast upuszczać i odtwarzać tabelę dla każdej pojedynczej zmiany? Nie rozumiem tego zachowania.
Jaime
15

Zamiast odznaczać to pole (złe rozwiązanie), powinieneś przestać edytować dane w ten sposób. Jeśli dane muszą zostać zmienione, zrób to za pomocą skryptu, abyś mógł łatwo przenieść je na produkcję i aby był pod kontrolą źródła. Ułatwia to również odświeżanie zmian testowych po zepchnięciu produkcji do deweloperów, aby umożliwić programistom pracę z nowszymi danymi.

HLGEM
źródło
2
Odp.) Możesz skopiować skrypt generowany przez SSMS i używać go w środowisku produkcyjnym. B) SSMS jest często łatwiejszy, szybszy i bezpieczniejszy, ponieważ SSMS obsługuje wszystkie szczegóły za Ciebie.
Trisped
2
Itg to wciąż bardzo zły pomysł. Nie chcesz odtwarzać tabeli rekordów 10 000 000 na prod. To nie jest szybsze. Jak to jest bezpieczniejsze? Złe dane to złe dane, a kontrola spójności działa, jeśli używasz napisanego skryptu, a także jeśli pozwalasz SSMS na napisanie jednego. Jest to ZŁA praktyka w 100% przypadków.
HLGEM
14

Wiele zmian, które można bardzo łatwo i wizualnie wprowadzić w edytorze tabel w SQL Server Management Studio, faktycznie wymaga SSMS, aby upuścić tabelę w tle i odtworzyć ją od zera. Nawet proste rzeczy, takie jak zmiana kolejności kolumn, nie mogą być wyrażone w standardowej instrukcji SQL DDL - wszystko, co można zrobić w SSMS, to upuszczenie i odtworzenie tabeli.

Ta operacja może być a) bardzo czasochłonna na dużym stole lub b) może nawet zakończyć się niepowodzeniem z różnych powodów (takich jak ograniczenia FK i inne rzeczy). Dlatego SSMS w SQL Server 2008 wprowadził tę nową opcję, którą inne odpowiedzi już zidentyfikowały.

Na początku może to wydawać się sprzeczne z intuicją, aby zapobiec takim zmianom - i na pewno jest to uciążliwe dla serwera deweloperów. Ale na serwerze produkcyjnym ta opcja i jej domyślna wartość zapobiegania takim zmianom mogą potencjalnie uratować życie!

marc_s
źródło
2
Jestem teraz na serwerze programistycznym, ale na serwerze produkcyjnym na pewno go wrócę. Jeszcze raz dziękuję za podzielenie się doświadczeniem
rem
1
Ale na przykład zmiana wielkości kolumny nvarchar ze 100 na 120 jest bardzo prostą operacją, którą można łatwo wykonać za pomocą ALTER TABLE ... to dlaczego SQL Server (Management Studio) upuszcza i ponownie tworzy tabelę dla takich skrzynie?
Jaime
4
@Jaime: że musisz zapytać twórców tego wizualnego projektanta - nikt inny nie wie. To po prostu fakt - dzięki projektantowi wizualnemu wiele prostych zmian zawsze zostanie wprowadzonych poprzez ponowne utworzenie tabeli i kopiowanie. Jeśli chcesz zastosować proste podejście, musisz samodzielnie poradzić sobie z tym, pisząc proste instrukcje T-SQL i wykonując je.
marc_s
1
Dziękuję @marc_s To jest dokładnie odpowiedź, której się spodziewałem, chociaż nie wierzyłem, że mają ukryty powód, który to wszystko wyjaśnia :)
Jaime
1
To ograniczenie zapobiega również zmianie identyfikatora obiektu bez Twojej wiedzy (na wypadek, gdybyś tego nie potrzebował).
Trisped