Вопрос

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

Это было полезно?

Решение

Рискуя показаться глупым, я не верю, что SQL Server поддерживает синтаксис удаления/каскада.Я думаю, вы можете настроить правило удаления для каскадного удаления (http://msdn.microsoft.com/en-us/library/ms152507.aspx), но, насколько я знаю, хитрость SQL Server заключается в том, чтобы просто запустить запрос на удаление один раз для каждой удаляемой таблицы, а затем проверить, что он работает.

Другие советы

Другой подход может быть:сначала избавьтесь от ограничений, а затем удалите таблицы за один раз.

Другими словами, DROP CONSTRAINT для каждого ограничения, затем DROP TABLE для каждой таблицы;на этом этапе порядок выполнения не должен быть проблемой.

Это требует sp___drop___constraints сценарий вы можете найти на Журнал базы данных:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

ПРИМЕЧАНИЕ это - очевидно - если вы хотели удалить ВСЕ таблицы в вашей базе данных, поэтому будьте осторожны

У меня нет доступа к SQL Server, чтобы проверить это, но как насчет:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Я не уверен, сработает ли подход Дерека.Вы еще не отметили его как лучший ответ.

Если не:Я думаю, с SQL Server 2005 это должно быть возможно.
Там ввели исключения (которые я пока не использовал).Поэтому отбросьте таблицу, перехватите исключение, если оно возникнет, и пробуйте следующую таблицу, пока все они не исчезнут.
Вы можете сохранить список таблиц во временной таблице и использовать курсор для перемещения по ней, если хотите.

В итоге я использовал Apache ddlutils выполнить удаление для меня, что и решило проблему в моем случае, хотя решение, которое работало только на сервере sql, было бы немного проще.

@Derek Park, я не знал, что там можно разделить таблицы запятыми, так что это удобно, но, похоже, это работает не совсем так, как ожидалось.Кажется, что ни IF EXISTS, ни CASCADE не распознаются сервером sql и работают drop table X, Y, Z кажется, работает только в том случае, если их следует удалить в указанном порядке.

Смотрите также http://msdn.microsoft.com/en-us/library/ms173790.aspx, который описывает синтаксис таблицы удаления.

От удаления таблиц в любом порядке вас удерживает зависимость внешних ключей между таблицами.Так что избавьтесь от FK, прежде чем начать.

  1. Используя системные представления INFORMATION_SCHEMA, получите список всех внешних ключей, связанных с любой из этих таблиц.
  2. Отбросьте каждый из этих внешних ключей
  3. Теперь вы сможете удалить все таблицы в любом порядке.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top