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

So deaktivieren Sie eine Fremdschlüsseleinschränkung in SQL Server (T-SQL-Beispiele)

Wenn Sie sich in einer Situation befinden, in der Sie eine Fremdschlüsseleinschränkung in SQL Server deaktivieren müssen, erfahren Sie hier, wie Sie dies mit Transact-SQL tun.

Dadurch können Sie Daten eingeben, ohne durch den Fremdschlüssel eingeschränkt zu werden. Offensichtlich würden Sie dies nicht tun, es sei denn, Sie hätten einen sehr guten Grund dafür. Fremdschlüssel erzwingen die referenzielle Integrität, sodass ihre Deaktivierung zu allen möglichen Problemen führen kann.

Beispiel 1 – Fremdschlüsselbeschränkung deaktivieren

Um eine Fremdschlüsseleinschränkung zu deaktivieren, verwenden Sie NOCHECK Argument innerhalb einer ALTER TABLE Aussage.

So:

ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician; 

Dieser Code deaktiviert eine Fremdschlüsseleinschränkung namens FK_BandMember_Musician .

Beispiel 2 – Überprüfung der Einschränkung

Wir können die sys.foreign_keys abfragen Systemansicht, um zu überprüfen, ob unsere Einschränkung deaktiviert wurde:

SELECT name AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keys;

Ergebnis:

+---------------------------+--------------------- --+------------------+| Einschränkung | ist_deaktiviert | is_not_trusted ||--------------------------------+---------------------- --------------------|| FK_BandMember_Band | 0 | 0 || FK_BandMitglied_Musiker | 1 | 1 || FK_MembershipPeriod_BandMember | 0 | 0 |+-------------------------------+-------------- -------------------+

In diesem Fall habe ich alle Fremdschlüsseleinschränkungen aus der aktuellen Datenbank ausgewählt.

Wir können sehen, dass dies die einzige ist, die deaktiviert ist (weil ihre is_disabled Spalte ist auf 1 gesetzt ).

Möglicherweise stellen Sie fest, dass is_not_trusted ist Spalte wird ebenfalls auf 1 gesetzt . Dies weist darauf hin, dass die Einschränkung nicht vom System verifiziert wurde.

Das ist sinnvoll, weil wir nicht mehr davon ausgehen können, dass die Einschränkung alle Daten geprüft hat. Die Tatsache, dass die Einschränkung deaktiviert ist, bedeutet, dass Daten jetzt in die Datenbank gelangen können, ohne von der Einschränkung geprüft zu werden. Daher besteht die Möglichkeit, dass ungültige Daten in der Datenbank vorhanden sind.

Wenn Sie die Einschränkung jemals wieder aktivieren müssen, haben Sie die Möglichkeit, das Vertrauen der Einschränkung wiederherzustellen (indem Sie die WITH CHECK Möglichkeit). Dadurch werden alle vorhandenen Zeilen überprüft, bevor die Einschränkung aktiviert wird.

Sie haben auch die Option nicht Überprüfung der vorhandenen Daten, dies sollte aber nur in seltenen Fällen erfolgen.

Hier ist noch einmal dieselbe Abfrage, aber mit einigen zusätzlichen Spalten, um die Tabellen und referenzierten Tabellen anzuzeigen:

SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trustedFROM sys.foreign_keys;

Ergebnis:

+---------------------------+--------------------- -----+---------------------+---------------+------ -------------+| Einschränkung | Tabelle | Referenzierte Tabelle | ist_deaktiviert | is_not_trusted ||--------------------------------+---------------------- ----+---------------------+---------------+------- -----------|| FK_BandMember_Band | Bandmitglied | Band | 0 | 0 || FK_BandMitglied_Musiker | Bandmitglied | Musiker | 1 | 1 || FK_MembershipPeriod_BandMember | Mitgliedschaftsdauer | Bandmitglied | 0 | 0 |+-------------------------------+-------------- ----+---------------------+---------------+------- -----------+