Удаление группы таблиц в SQL Server - PullRequest
6 голосов
/ 11 августа 2008

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

Ответы [ 7 ]

3 голосов
/ 25 августа 2008

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

1 голос
/ 19 сентября 2008

Для этого требуется сценарий sp ___ drop ___ ограничений , который можно найти в База данных журнала :

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

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

1 голос
/ 25 августа 2008

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

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

0 голосов
/ 25 августа 2008

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

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

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

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

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

0 голосов
/ 17 августа 2008

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

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

0 голосов
/ 11 августа 2008

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

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...