SQL Server: каскадный эквивалент удаленной таблицы? - PullRequest
21 голосов
/ 01 февраля 2011

В oracle, чтобы удалить все таблицы и ограничения, вы должны напечатать что-то вроде

DROP TABLE myTable CASCADE CONSTRAINTS PURGE;

и это полностью удалит таблицы и их зависимости. Что эквивалентно серверу SQL ??

Ответы [ 6 ]

32 голосов
/ 30 марта 2011

В SQL Server Management Studio перейдите в Параметры / Обозреватель объектов SQL Server / Сценарии и включите «Создать сценарий для зависимых объектов». Затем щелкните правой кнопкой мыши таблицу, выберите скрипт> drop to> new query и он сгенерирует его для вас.

23 голосов
/ 01 февраля 2011

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

К счастью, все это хранится в информационной схеме, и вы можете получить к ней доступ, чтобы получить свой список отклонений.

Этот блогсообщение должно иметь возможность получить то, что вам нужно: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'DatabaseName'
set @table = 'TableName'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END
5 голосов
/ 25 мая 2011

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

(
select
  'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
  ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
where
  t.table_name = tc.table_name
  and tc.constraint_name not like '%_pk'
  and tc.constraint_name not like 'pk_%'
  and t.table_catalog='<schema>'
) UNION (
select
  'DROP TABLE ' + t.table_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
where
  t.table_catalog='<schema>'
)
2 голосов
/ 03 августа 2015

Это все веселье и игры, пока какая-то таблица не ссылается на вашу таблицу ...

Тогда я должен изменить код, представленный так:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL
as
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME
      from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join
                  INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on
                   (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and
                    rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join
                  INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on
                   (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and
                    tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME)
     where tc.constraint_catalog = @database
       and tc_pk.TABLE_NAME = @table
    exec    sp_executesql @sql
END
go
1 голос
/ 25 августа 2014

В конечном итоге мы удаляем нашу таблицу. Таким образом, мы можем просто запустить 2 следующую команду:

ALTER TABLE ... DROP CONSTRAINT ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS Ограничение падения FK_PRJ_TYPE ;

- Имя таблицы и Имя ограничения являются параметром

2> DROP TABLE.

Первое ограничение на удаление с его именем, связанным с таблицей Во-вторых, вы можете оставить таблицу.

Это сработало для меня и легко.

0 голосов
/ 01 июня 2017

Мне просто нужно удалить внешний ключ

DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = 'XXX'


DECLARE db_cursor CURSOR FOR  
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY'

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    select    @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @TABLE_NAME
    exec    sp_executesql @sql 

       FETCH NEXT FROM db_cursor INTO  @TABLE_NAME, @CONSTRAINT_NAME 
END  

CLOSE db_cursor  
DEALLOCATE db_cursor 
...