26

Mam 60 stolików. Chcę rzucić 10 stołów, w których te 10 tabel to Wiązania (PK, FK) do pozostałych 20 stołów. Upuszczając te 10 tabel, muszę skrócić lub usunąć dane z pozostałych 20 tabel. Na koniec chcę wyłączyć wszystkie 60 ograniczeń tabeli (FK, PK), a następnie włączyć wszystkie ograniczenia tabeli po zakończeniu pracy nad dodawaniem/upuszczaniem tabel. czy to możliwe?Jak wyłączyć ograniczenia dla wszystkich tabel i włączyć je?

Kiedy upuszczam stolik, pytam o FK. Kiedy obcinam te zależności FK, to wciąż pokazuje to samo. Nie chcę zadzierać z tymi wszystkimi FK, PK.

Chcę poznać mądrzejszą metodę.

Odpowiedz

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

Można też to zrobić:

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

Aby umożliwić im potem

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 

Edit:
Jeśli wyłączenie ograniczenia nie wystarczy, trzeba będzie zrzucić ograniczenia.

Jeśli upuszczasz i tworzysz ponownie tabele, będziesz musiał odtworzyć ograniczenia związane z kluczem obcym.

Jeśli wystarczy upuścić ograniczenia co, może się on przydać:
SQL DROP TABLE foreign key constraint

Jeśli trzeba napisać skrypt, aby usunąć i utworzyć ograniczeń, można znaleźć mój post tutaj bardziej przydatne:
SQL Server: Howto get foreign key reference from information_schema?

+0

Próbowałem wyłączyć i tabela DROP ale tabela nie dostaję spadła mówiąc odwołany przez ograniczenie FK .., – Out

+0

@Pink wypróbowałeś instrukcję 'DROP' przed ponownym włączeniem' CONSTRAINT's? –

+0

Mam wyłączenie ograniczenia i tabelę DROP, po wyłączeniu musi upaść bez błędu, ale ponownie pokazuje "Nie można upuścić obiektu" DropTable ", ponieważ odwołuje się do ograniczenia klucza OBCEGO." – Out

5

spróbuje użyć tego polecenia

ALTER TABLE table_Name NOCHECK CONSTRAINT all 

aby wyłączyć wszystkie ograniczenia dla yo ur tabele i zrób to dla wszystkich twoich 10 tabel, ale przed tym sprawdź, czy nie wstawiłeś żadnych Delete_Cascade na twoich tabelach, ponieważ błąd, który się pojawia może być z powodu zależności sub_tables. jeśli to nie zadziałało, spróbuj wyłączyć określone ograniczenie za pomocą tego polecenia, może dwie lub trzy dodatkowe zależności.

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName 
7
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; 
+1

Po prostu zmień "nocheck constraint all" na "check constraint all", aby włączyć więzy dla wszystkich tabel. – Alexey

+0

Po wykonaniu kwerendy zakończyło się ono pomyślnie, ale nadal, gdy próbowałem upuścić tabelę, nie może spaść z powodu ograniczenia FK. Moim celem jest upuszczenie kilku tabel bez błędów FK, wystarczy wyłączyć FK i upuścić tabelę – Out

+0

Dodałem "where schemaTables.TABLE_TYPE =" BASE TABLE "" do zapytania, aby uzyskać tylko tabelę i to działa dla mnie. – jboo

21

Aby wyłączyć można zastosować to:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

Aby włączyć:

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