Сохранение изменений после редактирования таблицы в SQL Server Management Studio

265

Если я хочу сохранить какие-либо изменения в таблице, ранее сохраненной в SQL Server Management Studio (данные в таблице отсутствуют), я получаю сообщение об ошибке:

Сохранение изменений не разрешено. Внесенные вами изменения требуют удаления и повторного создания следующих таблиц. Вы внесли изменения в таблицу, которую нельзя создать заново, или включили опцию Запретить сохранение изменений, для которых требуется повторное создание таблицы.

Что может помешать редактированию таблицы? Или SQL Server Management Studio обычно требует повторного создания таблицы для редактирования? Что это - эта «опция Предотвратить сохранение изменений» ?

рем
источник
1
@Pang - Этот вопрос возник первым, это дубликат.
GrandMasterFlush
@Pang - я этого не знал, спасибо.
GrandMasterFlush

Ответы:

573

Зайдите в Инструменты -> Параметры -> Дизайнеры-> Снимите флажок «Запретить сохранение изменений, которые требуют пересоздания таблицы». Вуаля.

Это происходит потому, что иногда необходимо удалить и воссоздать таблицу, чтобы что-то изменить. Это может занять некоторое время, так как все данные должны быть скопированы во временную таблицу и затем снова вставлены в новую таблицу. Поскольку SQL Server по умолчанию не доверяет вам, вам нужно сказать: «Хорошо, я знаю, что делаю, теперь позвольте мне делать свою работу».

Pedro
источник
8
Сайт поддержки Microsoft не одобряет это, но если у вас нет данных в таблице, я не вижу вреда. Вероятно, лучше всего использовать TSQL для внесения изменений.
Джон Смок
6
Я бы лично не рекомендовал использовать конструктор для важных баз данных. Я видел, что это делает дорогостоящие ошибки во многих случаях. Кроме того, это продвигает ленивые привычки разработки и позволяет людям изменять структуру базы данных, которые могут быть недостаточно опытными, чтобы сделать это, если они не могут управлять маршрутом кода SQL.
Марк Диксон
5
Согласен, Марк, но в начале разработки мне не нужно писать кучу скриптов.
Кристофер
7
Шокирует тот факт, что сейчас сентябрь 2016 года, и эта невероятная недружелюбная для пользователя ошибка (без возможности спросить «Привет, вы хотели бы РАЗРЕШИТЬ изменения в таблице?») Все еще в игре. Нет, вы просто получаете кнопку «Отмена», и вам необходимо заново вносить изменения. SQL Server у него самый тупой.
Майк Глэдхилл
2
@ Майк Гледхилл Привет из 2019 года, и это все еще так LOL
Капитан Кенпачи
116

Инструменты> Параметры

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

Снимите галочку с опции выше

Prasanna
источник
5
Спасибо за скриншот. Я искал что-то подобное, чтобы помочь мне найти этот глупый вариант. Диалоговое окно должно иметь флажок для «сделать это в любом случае», когда он говорит, что вы не можете.
Крис Бенард
2
Лучшая практика После того, как вы измените эту опцию, проверьте верхнюю опцию «Автоматически генерировать сценарии изменений», чтобы предотвратить потерю данных
dubi
Спасибо за изображение. Это очень полезно :)
M A.
72

Чтобы обойти эту проблему, используйте операторы SQL, чтобы внести изменения в структуру метаданных таблицы.

Эта проблема возникает, если включена опция «Запретить сохранение изменений, требующих пересоздания таблицы» .

Источник: сообщение об ошибке при попытке сохранить таблицу в SQL Server 2008: «Сохранение изменений не разрешено»

Даниэль Вассалло
источник
12
Мой вопрос здесь: почему SQL Server не использует необходимые операторы T-SQL вместо удаления и повторного создания таблицы для каждого отдельного изменения? Я не могу понять это поведение.
Хайме
15

Вместо того, чтобы снимать флажок (плохое решение), вы должны перестать редактировать данные таким образом. Если данные должны быть изменены, сделайте это с помощью скрипта, чтобы вы могли легко перенести их в рабочую среду и чтобы они находились под контролем исходного кода. Это также упрощает обновление тестовых изменений после того, как производство было перенесено на dev, что позволяет разработчикам работать с более свежими данными.

HLGEM
источник
2
A) Вы можете скопировать сценарий, который генерирует SSMS, и использовать его в своей производственной среде. Б) SSMS часто проще, быстрее и безопаснее, потому что SSMS обрабатывает все детали для вас.
Trisped
2
Это все еще очень плохая идея. Вы не хотите воссоздать таблицу записей 1000000 на Prod. Это не быстрее. Как это безопаснее? Плохие данные - это плохие данные, и проверки согласованности работают, если вы используете сценарий, который вы написали, а также если вы позволяете 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 отбрасывала таблицу в фоновом режиме и воссоздала ее с нуля. Даже простые вещи, такие как переупорядочение столбцов, не могут быть выражены в стандартном операторе SQL DDL - все, что может сделать SSMS - это удалить и заново создать таблицу.

Эта операция может быть: а) очень трудоемкой для большой таблицы, или б) может даже потерпеть неудачу по разным причинам (например, ограничения FK и прочее). Поэтому SSMS в SQL Server 2008 представила эту новую опцию, которую другие ответы уже определили.

На первый взгляд может показаться нелогичным предотвращать такие изменения - и это, безусловно, неприятно для сервера разработки. Но на рабочем сервере этот параметр и его значение по умолчанию для предотвращения таких изменений становится потенциальным спасением жизни!

marc_s
источник
2
Я сейчас на сервере разработки, но на рабочем я обязательно включу его обратно. Еще раз спасибо за обмен опытом
rem
1
Но, например, изменить размер столбца nvarchar со 100 на 120 - это очень простая операция, которую можно легко выполнить с помощью ALTER TABLE ... тогда, почему SQL Server (Management Studio) удаляет и заново создает таблицу для такого случаи?
Хайме
4
@Jaime: что нужно спросить у разработчиков этого визуального дизайнера - больше никто не знает. Это просто факт - с визуальным дизайнером многие прямые изменения всегда будут сделаны путем воссоздания таблицы и копирования. Если вы хотите использовать простой подход, вы сами должны справиться с ним, написав несколько простых операторов T-SQL и выполнив их.
marc_s
1
Спасибо @marc_s Это именно тот ответ, который я ожидал, хотя я мало верил, что у них есть скрытая причина, которая могла бы объяснить все это :)
Jaime
1
Это ограничение также предотвращает изменение идентификатора объекта без вашего ведома (на случай, если этого не произойдет).
Trisped