sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan deaktiveres en fremmednøglebegrænsning i SQL Server (T-SQL-eksempler)

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                |
+--------------------------------+------------------+---------------------+---------------+------------------+

  1. 5 måder at implementere case-usensitiv søgning i SQLite med fuld Unicode-understøttelse

  2. psql:FATAL:Identifikationsgodkendelse mislykkedes for brugerens postgres

  3. Hvilken datatype for breddegrad og længdegrad?

  4. OPRET Oracle-procedure