Есть ли простой способ удалить группу взаимосвязанных таблиц в SQL Server? В идеале, я бы хотел не беспокоиться о том, в каком порядке они находятся, так как я знаю, что к концу процесса вся группа исчезнет.
Риск звучать глупо, я не верю, что SQL Server поддерживает синтаксис удаления / каскада. Я думаю, что вы можете настроить правило удаления для каскадного удаления ( http://msdn.microsoft.com/en-us/library/ms152507.aspx ), но, насколько я знаю, хитрость с SQL Server заключается в том, чтобы просто запустить Ваш запрос на удаление для каждой таблицы, которую вы отбрасываете, один раз, затем проверьте, что это работает.
У меня нет доступа к SQL Server, чтобы проверить это, но как насчет:
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
Я не уверен, работает ли подход Дерека. Вы еще не отметили его как лучший ответ.
Если нет: с SQL Server 2005 это должно быть возможно, я думаю.
Там они ввели исключения (которые я еще не использовал). Поэтому отбросьте таблицу, поймайте исключение, если оно произошло, и попробуйте следующую таблицу, пока все они не исчезнут.
Вы можете сохранить список таблиц во временной таблице и использовать курсор для его перемещения, если хотите.
В итоге я использовал Apache ddlutils для выполнения удаления для меня, что в моем случае решило проблему , хотя решение, которое работало только на сервере SQL, было бы немного проще.
@Derek Park, я не знал, что там можно разделить запятыми отдельные таблицы, так что это удобно, но, похоже, это не работает так, как ожидалось. Nether, ЕСЛИ EXISTS или CASCADE распознаются сервером sql, кажется, и запуск, drop table X, Y, Z
кажется, работает, только если они должны быть отброшены в указанном порядке.
См. Также http://msdn.microsoft.com/en-us/library/ms173790.aspx , в котором описывается синтаксис удаленной таблицы.
То, что удерживает вас от отбрасывания таблиц в любом порядке, - это зависимости внешнего ключа между таблицами. Так что избавьтесь от ФК, прежде чем начать.
- Используя системные представления INFORMATION_SCHEMA, получите список всех внешних ключей, связанных с любой из этих таблиц.
- Бросьте каждый из этих внешних ключей
- Теперь вы сможете удалить все таблицы в любом порядке.
Другой подход может быть следующим: сначала избавиться от ограничений, а затем отбросить таблицы за один раз.
Другими словами, DROP CONSTRAINT для каждого ограничения, затем DROP TABLE для каждой таблицы; на этом этапе порядок исполнения не должен быть проблемой.
Для этого требуется скрипт sp___drop___constraints, который вы можете найти в Database Journal :
sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO
ОБРАТИТЕ ВНИМАНИЕ - это - очевидно - если вы намеревались удалить ВСЕ таблицы в вашей базе данных, так что будьте осторожны