Удаление группы таблиц в SQL Server

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

Ответов (7)

Решение

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

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

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Для этого требуется сценарий 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 2005 это должно быть возможно.
Там ввели исключения (которые я еще не использовал). Так что отбросьте таблицу, перехватите исключение, если оно произойдет, и попробуйте следующую таблицу, пока все они не исчезнут.
Вы можете сохранить список таблиц во временной таблице и использовать курсор для его перемещения, если хотите.

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

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

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

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

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

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

  1. Используя системные представления INFORMATION_SCHEMA, получите список всех внешних ключей, связанных с любой из этих таблиц.
  2. Отбросьте каждый из этих внешних ключей
  3. Теперь у вас должна быть возможность отбросить все таблицы в любом порядке.