Hvis du befinder dig i den situation, hvor du har brug for at deaktivere en fremmednøglebegrænsning i SQL Server, kan du se her, hvordan du gør det ved hjælp af Transact-SQL.
Dette giver dig mulighed for at indtaste data uden at være begrænset af den fremmede nøgle. Det er klart, at du ikke ville gøre dette, medmindre du havde en meget god grund til at gøre det. Fremmednøgler håndhæver referentiel integritet, så deaktivering af dem har potentialet til at skabe alle mulige problemer.
Eksempel 1 – Deaktiver Foreign Key Constraint
For at deaktivere en begrænsning af en fremmednøgle skal du bruge NOCHECK
argument i en ALTER TABLE
erklæring.
Sådan:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Denne kode deaktiverer en fremmednøgle-begrænsning kaldet FK_BandMember_Musician .
Eksempel 2 – Gennemgå begrænsningen
Vi kan forespørge på sys.foreign_keys
systemvisning for at bekræfte, at vores begrænsning er blevet deaktiveret:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Resultat:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
I dette tilfælde valgte jeg alle fremmednøglebegrænsninger fra den aktuelle database.
Vi kan se, at dette er den eneste, der er deaktiveret (fordi dens is_disabled kolonne er indstillet til 1 ).
Du bemærker måske, at is_not_trusted kolonne er også indstillet til 1 . Dette indikerer, at begrænsningen ikke er blevet verificeret af systemet.
Dette giver mening, fordi vi ikke længere kan antage, at begrænsningen har kontrolleret alle data. Det faktum, at begrænsningen er deaktiveret, betyder, at data nu kan komme ind i databasen uden at blive kontrolleret af begrænsningen. Derfor er der mulighed for, at ugyldige data er til stede i databasen.
Hvis du nogensinde har brug for at genaktivere begrænsningen, vil du have mulighed for at genoprette begrænsningens tillid (ved at bruge WITH CHECK
mulighed). Dette vil kontrollere alle eksisterende rækker, før begrænsningen aktiveres.
Du vil også have mulighed for ikke kontrollere de eksisterende data, men dette bør kun gøres i sjældne tilfælde.
Her er den samme forespørgsel igen, men med nogle ekstra kolonner til at vise tabellerne og refererede tabeller:
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;
Resultat:
+--------------------------------+------------------+---------------------+---------------+------------------+ | 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 | +--------------------------------+------------------+---------------------+---------------+------------------+