Als u zich in de situatie bevindt waarin u een externe-sleutelbeperking in SQL Server moet uitschakelen, kunt u dat als volgt doen met Transact-SQL.
Hiermee kunt u gegevens invoeren zonder te worden beperkt door de externe sleutel. Het is duidelijk dat u dit niet zou doen tenzij u een zeer goede reden had om dit te doen. Buitenlandse sleutels dwingen referentiële integriteit af, dus het uitschakelen ervan kan allerlei problemen veroorzaken.
Voorbeeld 1 – De beperking van de externe sleutel uitschakelen
Om een externe sleutelbeperking uit te schakelen, gebruikt u de NOCHECK
argument binnen een ALTER TABLE
verklaring.
Zoals dit:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Deze code schakelt een externe sleutelbeperking uit met de naam FK_BandMember_Musician .
Voorbeeld 2 – Bekijk de beperking
We kunnen de sys.foreign_keys
. opvragen systeemweergave om te controleren of onze beperking is uitgeschakeld:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Resultaat:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
In dit geval heb ik alle externe sleutelbeperkingen uit de huidige database geselecteerd.
We kunnen zien dat dit de enige is die is uitgeschakeld (omdat het is_disabled is) kolom is ingesteld op 1 ).
Je merkt misschien dat de is_not_trusted kolom is ook ingesteld op 1 . Dit geeft aan dat de beperking niet door het systeem is geverifieerd.
Dit is logisch, omdat we er niet langer van kunnen uitgaan dat de constraint alle gegevens heeft gecontroleerd. Het feit dat de beperking is uitgeschakeld, betekent dat gegevens nu in de database kunnen komen zonder te worden gecontroleerd door de beperking. Daarom bestaat de kans dat er ongeldige gegevens in de database aanwezig zijn.
Als u ooit de beperking opnieuw moet inschakelen, heeft u de mogelijkheid om het vertrouwen van de beperking te herstellen (door de WITH CHECK
te gebruiken optie). Hiermee worden alle bestaande rijen gecontroleerd voordat de beperking wordt ingeschakeld.
Je hebt ook de optie niet het controleren van de bestaande gegevens, maar dit mag alleen in zeldzame gevallen worden gedaan.
Hier is dezelfde zoekopdracht opnieuw, maar met wat extra kolommen om de tabellen en tabellen waarnaar wordt verwezen te tonen:
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
Resultaat:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+