sql >> Database >  >> RDS >> Sqlserver

Een beperking van een externe sleutel in SQL Server uitschakelen (T-SQL-voorbeelden)

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

  1. het creëren van geparametriseerde views in oracle11g

  2. Effectieve strategie voor het achterlaten van een audittrail/wijzigingsgeschiedenis voor DB-applicaties?

  3. Fysieke replicatiemechanismen in PostgreSQL

  4. Oracle Update Query met behulp van Join