Подтвердить что ты не робот

Как отключить ограничения для всех таблиц и включить их?

У меня 60 таблиц. Я хочу сбросить 10 таблиц, где эти 10 таблиц являются Constraints (PK, FK) для других 20 таблиц. При отбрасывании этих 10 таблиц мне нужно усечь или удалить данные из остальных 20 таблиц. Наконец, я хочу отключить все 60 табличных ограничений (FK, PK), а затем включить все 60 табличных ограничений после выполнения моей работы по добавлению/удалению таблиц. Возможно ли это?

Когда я бросаю стол, он просит FK. Когда я усекаю эти зависимости FK, он также все еще показывает то же самое. Я не хочу возиться со всеми этими FK, PK.

Я хочу узнать более умный метод.

4b9b3361

Ответ 1

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO

Вы также можете сделать это:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
GO

Чтобы включить их позже

EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
GO

-- SQL enable all constraints - enable all constraints sql server
-- sp_MSforeachtable is an undocumented system stored procedure
EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"
GO

Изменить:
Если отключить ограничения недостаточно, вам придется отказаться от ограничений.

Если вы отбрасываете и воссоздаете таблицы, вам придется впоследствии воссоздать ограничения внешнего ключа.

Если вам просто нужно отказаться от ограничений, вы можете найти это полезным:
Ограничение внешнего ключа SQL DROP TABLE

Если вам нужно написать script, чтобы удалить и создать ограничения, вы можете найти мой пост здесь более полезным:
SQL Server: Как получить ссылку на внешний ключ из information_schema?

Ответ 2

Чтобы отключить, вы можете применить это:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Чтобы включить:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Ответ 3

declare @tname varchar(128), @tschema varchar(128);

declare tables cursor for
select TABLE_SCHEMA, TABLE_NAME
from INFORMATION_SCHEMA.TABLES;

open tables;

fetch next from tables
    into @tschema, @tname;

while @@FETCH_STATUS = 0
begin
    execute ('alter table [' + @tschema + '].[' + @tname + '] nocheck constraint all');
    fetch next from tables
        into @tschema, @tname;
end;

close tables;

deallocate tables;

Ответ 4

Попробуйте использовать эту команду

ALTER TABLE table_Name NOCHECK CONSTRAINT all

чтобы отключить все ограничения для ваших таблиц и сделать это для всех ваших 10 таблиц, но перед этим проверьте, не поместили ли какие-либо Delete_Cascade в свои таблицы, потому что ошибка, которая отображается, возможно, из-за зависимостей sub_tables. если он не работал, попытайтесь отключить определенное ограничение этой командой, возможно, две или три дополнительные зависимости.

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName