Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So listen Sie alle Fremdschlüssel mit WITH NOCHECK in SQL Server auf

Das Folgende gibt den Namen der Fremdschlüssel in der aktuellen Datenbank zurück, die deaktiviert sind, d. h. WITH NOCHECK

Für SQL Server 2005/2008:

select * from sys.foreign_keys where is_disabled=1 



In der Antwort gab es einige Diskussionen über den Unterschied zwischen deaktiviert und nicht vertrauenswürdig. Im Folgenden wird der Unterschied erklärt. Hier ist ein Code, um den Unterschied zwischen is_disabled und isnotrusted zu verdeutlichen (i int nicht null, fk int nicht null) Tabelle t2 erstellen (i int nicht null) – Primärschlüssel für t2 erstellen, Tabelle ändern, Einschränkung t2 hinzufügen, Primärschlüssel pk_1 (i) – Fremdschlüssel für Tabelle t1 erstellen, Tabelle ändern, Einschränkung t1 hinzufügen, fk_1 Fremdschlüssel ( fk) Referenzen t2 (i)--fügen Sie einige Datensätze einfüge t2-Werte ein(100)füge t2-Werte ein(200)füge t2-Werte ein(300)füge t2-Werte ein(400)füge t2-Werte ein(500)füge t1-Werte ein(1.100)füge t1-Werte ein (2.100) t1-Werte einfügen (3.500) t1-Werte einfügen (4.500)------------------------------ 1. aktiviert und vertrauenswürdig auswählen name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 2. Deaktivieren Sie die Constraintalter-Tabelle t1 NOCHECK CONSTRAINT fk_1select name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 3. Aktivieren Sie Constraint erneut, Daten sind nicht c geprüft, also nicht vertrauenswürdig.-- Das bedeutet, dass der Optimierer immer noch die Columnalter-Tabelle prüfen muss. t1 CHECK CONSTRAINT fk_1 select name,is_disabled,is_not_trusted from sys.foreign_keysGO--4. Lösche die Fremdschlüsseleinschränkung und füge sie erneut hinzu – es stellt sicher, dass ihre aktivierte – Einschränkung dann aktiviert und vertrauenswürdig ist. Ändere Tabelle t1. DROP CONSTRAINT fk_1 ,is_not_trusted von sys.foreign_keysGO--5. Lösche die Fremdschlüsseleinschränkung und füge sie hinzu, aber überprüfe sie nicht – die Einschränkung ist dann aktiviert, aber nicht vertrauenswürdig .foreign_keysGO

ist_deaktiviert bedeutet, dass die Beschränkung deaktiviert ist

ist nicht vertrauenswürdig bedeutet, dass SQL Server nicht darauf vertraut, dass die Spalte mit der Fremdschlüsseltabelle verglichen wurde.

Daher kann nicht davon ausgegangen werden, dass die erneute Aktivierung der Fremdschlüsselbeschränkung optimiert wird. Um sicherzustellen, dass der Optimierer der Spalte vertraut, ist es am besten, die Fremdschlüsseleinschränkung zu löschen und sie mit WITH CHECK neu zu erstellen Möglichkeit (4.)