sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man inaktiverar en främmande nyckelbegränsning i SQL Server (T-SQL-exempel)

Om du hamnar i situationen där du behöver inaktivera en främmande nyckel-begränsning i SQL Server, så här gör du det med Transact-SQL.

Detta gör att du kan ange data utan att vara begränsad av den främmande nyckeln. Uppenbarligen skulle du inte göra detta om du inte hade en mycket bra anledning att göra det. Främmande nycklar upprätthåller referensintegritet, så att inaktivera dem har potential att skapa alla möjliga problem.

Exempel 1 – Inaktivera begränsningen för främmande nyckel

För att inaktivera en främmande nyckel-begränsning, använd NOCHECK argument i en ALTER TABLE uttalande.

Så här:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Den här koden inaktiverar en främmande nyckel-begränsning som heter FK_BandMember_Musician .

Exempel 2 – Granska begränsningen

Vi kan fråga sys.foreign_keys systemvy för att verifiera att vår begränsning har inaktiverats:

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 det här fallet valde jag alla begränsningar för främmande nyckel från den aktuella databasen.

Vi kan se att detta är den enda som är inaktiverad (eftersom dess is_disabled kolumnen är inställd på 1 ).

Du kanske märker att is_not_trusted kolumnen är också inställd på 1 . Detta indikerar att begränsningen inte har verifierats av systemet.

Detta är vettigt, eftersom vi inte längre kan anta att begränsningen har kontrollerat all data. Det faktum att begränsningen är inaktiverad innebär att data nu kan komma in i databasen utan att kontrolleras av begränsningen. Därför finns det risk för att ogiltiga data finns i databasen.

Om du någonsin behöver återaktivera begränsningen kommer du att ha möjlighet att återställa begränsningens förtroende (genom att använda WITH CHECK alternativ). Detta kommer att kontrollera alla befintliga rader innan begränsningen aktiveras.

Du kommer också att ha möjlighet att inte kontrollera befintliga data, men detta bör endast göras i sällsynta fall.

Här är samma fråga igen, men med några extra kolumner för att visa tabellerna och refererade 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. framåt cross edition triggers i R12.2

  2. WinRT System.Data - Anslut till SQL

  3. Ladda upp bilder i CKEditor utan att använda ett plugin

  4. Hur kör man samma fråga på alla databaser på en instans?