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

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

11.08.2008 04:32:01
7 ОТВЕТОВ
РЕШЕНИЕ

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

4
25.08.2008 07:40:42

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

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
0
11.08.2008 05:19:48

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

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

0
16.08.2008 20:00:05

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

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

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

0
25.08.2008 07:08:17

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

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

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

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

1
25.08.2008 07:18:16

Для этого требуется скрипт 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

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

1
19.09.2008 15:59:15