Удаление группы таблиц в SQL Server
-
08-06-2019 - |
Вопрос
Есть ли простой способ удалить группу взаимосвязанных таблиц в 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, прежде чем начать.
- Используя системные представления INFORMATION_SCHEMA, получите список всех внешних ключей, связанных с любой из этих таблиц.
- Отбросьте каждый из этих внешних ключей
- Теперь вы сможете удалить все таблицы в любом порядке.