SQL Server: каскадный эквивалент таблицы капель?

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

DROP TABLE myTable CASCADE CONSTRAINTS PURGE;

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

Ответ 1

Я не верю, что 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

Ответ 2

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

Ответ 3

Это может быть ужасное решение, но я нахожу его быстрым. Это похоже на ответ Винни, но продукт оператора 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>'
)

Ответ 4

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

ALTER TABLE... DROP CONSTRAINT...

ТАБЛИЦА DROP...

1 > ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE;

- Имя таблицы и Constraint Name - это параметр

2 > ТАБЛИЦА ДРОБ.

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

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

Ответ 5

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

Затем я должен изменить код, указанный так:

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

Ответ 6

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

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