Збереження змін після редагування таблиці в SQL Server Management Studio


265

Якщо я хочу зберегти будь-які зміни в таблиці, попередньо збереженій у студії управління SQL Server (даних у таблиці немає), я отримую повідомлення про помилку:

Збереження змін заборонено. Внесені вами зміни потребують відміни та повторного створення наступних таблиць. Ви або внесли зміни в таблицю, яку неможливо повторно створити, або увімкнено опцію Запобігти збереження змін, які вимагають повторного створення таблиці.

Що може завадити легко редагувати таблицю? Або це звичайний спосіб для SQL Server Management Studio вимагати відтворення таблиці для редагування? Що це - ця "опція запобігання збереженню змін" ?



1
@Pang - Це питання постало першим, це дублікат.
GrandMasterFlush


@Pang - я цього не знав, дякую.
GrandMasterFlush

Відповіді:


573

Перейдіть у меню Інструменти -> Опції -> Дизайнери-> Зніміть прапорець "Запобігти збереження змін, які потребують відновлення таблиці". Вуаля.

Це трапляється тому, що іноді доводиться опускати та відтворювати таблицю, щоб щось змінити. Це може зайняти деякий час, оскільки всі дані потрібно скопіювати у тимчасову таблицю, а потім знову вставити у нову таблицю. Оскільки SQL Server за замовчуванням вам не довіряє, вам потрібно сказати "Добре, я знаю, що я роблю, тепер дозвольте мені зробити свою роботу".


8
Сайт підтримки Microsoft перешкоджає цьому, але якщо у вас немає даних у таблиці, я не бачу шкоди. Можливо, найкраще використовувати TSQL для внесення змін.
Джон Смок

6
Мені особисто не вдається використовувати дизайнер для важливих баз даних. Я бачив, як це багато разів робило дорогі помилки. Окрім того, він сприяє розвитку звичок лінивого розвитку та дозволяє людям змінювати структуру бази даних, яка може бути недостатньо досвідченою для цього, якщо вони не можуть керувати маршрутом коду SQL.
Марк W Діксон

5
Погодився, Марк, але в ранньому розвитку мені не потрібно писати купу сценаріїв.
Крістофер

7
Це шокує, що вересень 2016 року, і ця неймовірна помилка, непривітлива для користувачів (без можливості запитувати "Ей, хотіли б ВЗАЄМИТИ зміни таблиці?"), Як і раніше, грає. Ні, ви просто отримуєте кнопку Скасувати, і вам доведеться вносити зміни знову. SQL Server - це найглупіше.
Майк Гледхілл

2
@Mike Gledhill Привітання з 2019 року, і це все ще так LOL
Капітан Кенпачі

116

Інструменти> Параметри

введіть тут опис зображення

Зніміть прапорець вище


5
Дякую за скріншот. Я шукав щось подібне, щоб допомогти мені знайти той дурний варіант. У діалоговому вікні має бути встановлено прапорець "Зробити це все одно", коли він говорить, що ви не можете.
Кріс Бенар

2
Найкраща практика Після зміни цього параметра - перевірити верхній параметр "Автоматично створювати сценарії зміни", щоб запобігти втраті даних
dubi

Дякую за зображення Це дуже корисно :)
М А.

72

Щоб вирішити цю проблему, використовуйте оператори SQL, щоб внести зміни в структуру метаданих таблиці.

Ця проблема виникає, коли "Запобігати збереженню змін, які потребують відновлення таблиці" ввімкнено опцію .

Джерело: Повідомлення про помилку при спробі збереження таблиці в SQL Server 2008: "Збереження змін не дозволено"


12
Моє запитання тут: чому SQL Server не використовує необхідні оператори T-SQL замість того, щоб скидати та відтворювати таблицю для кожної зміни? Я не можу зрозуміти такої поведінки.
Хайме

15

Замість того, щоб знімати прапорець (погане рішення), ви повинні зупинити редагування даних таким чином. Якщо дані потрібно змінити, зробіть це за допомогою скрипту, щоб ви могли легко перенести його на виробництво і щоб він знаходився під контролем джерела. Це також полегшує оновлення змін тестування після того, як виробництво було висунуто вниз до розробника, щоб розробники могли працювати проти більш свіжих даних.


2
A) Ви можете скопіювати скрипт, який генерує SSMS, та використовувати його у виробничому середовищі. B) SSMS часто легше, швидше та безпечніше, оскільки SSMS обробляє всі деталі для вас.
Trisped

2
Itg все ще дуже погана ідея. Ви не хочете відтворити таблицю записів на 10 000 000 у продажі. Це не швидше. Як це безпечніше? Неправильні дані - це погані дані, і перевірка узгодженості спрацьовує, якщо ви використовуєте написаний сценарій, а також якщо ви дозволяєте SSMS писати його. У 100% випадків це ПОБОРНА практика.
HLGEM

15

Перейдіть до SSMS і спробуйте це

Меню >> Інструменти >> Опції >> Дизайнери >> Зніміть прапорець "Запобігти збереженню змін, які потребують відновлення таблиці".

Ось дуже вдале пояснення цього: http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permitted-the-changes -у вас є зроблені-вимагають-наступні-таблиці-щоб бути скинуті-і-знову створені-у вас є або зроблено-зміни-на-вкладку /


14

Багато змін, які ви можете зробити дуже легко і візуально в редакторі таблиць в SQL Server Management Studio, насправді вимагають, щоб SSMS відкидав таблицю у фоновому режимі і заново створював її з нуля. Навіть такі прості речі, як переупорядкування стовпців, не можуть бути виражені у стандартному операторі DDL SQL - все, що може зробити SSMS, це скинути та відтворити таблицю.

Ця операція може бути: а) вимагає багато часу за великим столом, або б) може навіть вийти з ладу з різних причин (наприклад, обмеження та інше). Тому SSMS у SQL Server 2008 представив цю нову опцію, яку інші відповіді вже визначено.

Спочатку може здатися контрінтуїтивним запобігання подібних змін - і це, звичайно, неприємність на сервері розробників. Але на виробничому сервері ця опція та її значення за замовчуванням запобігання таким змінам стає потенційною економією життя!


2
Зараз я перебуваю на сервері розробки, але на виробництві я його обов'язково поверну. Ще раз дякую за обмін досвідом
рем.

1
Але, наприклад, зміна розміру стовпчика nvarchar від 100 до 120 - це дуже проста операція, яку можна легко виконати за допомогою ALTER TABLE ... тоді, чому SQL Server (Management Studio) скидає і відновлює таблицю для такої справи?
Хайме

4
@Jaime: що вам потрібно запитати у розробників цього візуального дизайнера - ніхто більше не знає. Це лише факт - з візуальним дизайнером багато прямих змін завжди буде здійснено шляхом повторного створення таблиці та копіювання навколо. Якщо ви хочете скористатися прямолінійним підходом, вирішувати вам самостійно, написавши кілька простих операторів T-SQL та виконавши їх.
marc_s

1
Дякую @marc_s Саме такої відповіді я очікував, хоча я мало вірив у них, маючи приховану причину, яка б це все пояснила :)
Jaime

1
Це обмеження також запобігає зміні ідентифікатора об'єкта, не знаючи про це (у випадку, якщо цього не потрібно зробити).
Trisped

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.