sql >> Database >  >> RDS >> Sqlserver

Hoe u alle beperkingen van CHECK &Foreign Key voor een tabel in SQL Server inschakelt (T-SQL-voorbeelden)

U kunt de onderstaande code gebruiken om alle CHECK . in te schakelen en externe-sleutelbeperkingen voor een specifieke tabel in SQL Server.

Wanneer u een beperking in SQL Server inschakelt, moet u beslissen of het bestaande gegevens moet controleren of niet. Dit is een belangrijke overweging als de tabel al gegevens bevat, omdat die bestaande gegevens mogelijk de regels van de beperking schenden.

Voorbeeldstellingen

Hieronder staan ​​twee voorbeeldinstructies die het verschil laten zien tussen het controleren van bestaande gegevens en het niet controleren ervan wanneer u de beperkingen inschakelt.

Gebruik WITH CHECK . om bestaande gegevens te controleren in uw verklaring bij het inschakelen van de beperkingen, gebruik anders WITH NOCHECK .

Met cheque:

WIJZIG TABEL TableName MET CONTROLE CONTROLEER ALLES

Zonder cheque:

ALTER TABLE TableName MET NOCHECK CONTROLEER ALLES

Vervang gewoon TableName met de naam van de toepasselijke tabel.

Hieronder is een voorbeeld waarin ik dit doe en de resultaten controleer.

Voorbeeld 1 – Bekijk de beperkingen

Ik zal eerst even kijken naar de huidige CHECK beperkingen in de database, om te zien of ze al dan niet zijn ingeschakeld of uitgeschakeld.

SELECT OBJECT_NAME(parent_object_id) AS 'Table', naam AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraint;
 Resultaat:

+----------------+-----------------+----------- ----+------------------+| Tafel | beperking | is_disabled | is_not_trusted ||----------------+-----------------+------------ ---+------------------|| BeperkingTest | chkPrijs | 1 | 1 || BeperkingTest | chkValidEndDate | 1 | 1 || BeperkingTest | chkTeamSize | 1 | 1 || beroep | chkJobTitel | 0 | 0 |+----------------+-----------------+------------ ---+------------------+

Er zijn dus momenteel vier CHECK beperkingen in de database, waarvan er drie voor de ConstraintTest tafel.

We kunnen zien dat alle beperkingen voor de tabel zijn uitgeschakeld omdat is_disabled is ingesteld op 1 .

We kunnen ook zien dat de is_not_trusted kolom is ingesteld op 1 voor deze beperkingen. Dit betekent dat ze niet worden vertrouwd. Ze zijn niet te vertrouwen als ze zijn uitgeschakeld, omdat ongeldige gegevens de database kunnen binnenkomen zonder te worden gecontroleerd. Meer hierover hieronder.

De andere beperking (voor een andere tabel) is al ingeschakeld en vertrouwd (maar we kunnen die tabel/beperking in dit artikel negeren).

Voorbeeld 2 – Schakel de beperkingen in met WITH CHECK

Nu schakel ik alle beperkingen in voor de ConstraintTest tafel:

WIJZIG TABEL ConstraintTest MET CONTROLE CONTROLEER ALLES;

Dat is alles - klaar.

Laten we nu dezelfde query uitvoeren als in het eerste voorbeeld om het resultaat te zien.

SELECT OBJECT_NAME(parent_object_id) AS 'Table', naam AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraint;
 Resultaat:

+----------------+-----------------+----------- ----+------------------+| Tafel | beperking | is_disabled | is_not_trusted ||----------------+-----------------+------------ ---+------------------|| BeperkingTest | chkPrijs | 0 | 0 || BeperkingTest | chkValidEndDate | 0 | 0 || BeperkingTest | chkTeamSize | 0 | 0 || beroep | chkJobTitel | 0 | 0 |+----------------+-----------------+------------ ---+------------------+

Alle drie de beperkingen voor de ConstraintTest table zijn nu ingeschakeld en vertrouwd.

Ze worden vertrouwd omdat ik WITH CHECK . heb gebruikt in mijn verklaring. Als ik dat niet had gedaan, had ik een ander resultaat gehad, zoals je hieronder zult zien.

Door WITH CHECK . te gebruiken , ik kan er zeker van zijn dat alle bestaande gegevens in de tabel inderdaad voldoen aan de beperkingen.

Voorbeeld 3 – Schakel de beperkingen in met WITH NOCHECK

Nu zal ik de beperkingen opnieuw inschakelen met WITH CHECK zodat we kunnen zien hoe dit de uitkomst beïnvloedt.

Maar eerst moet ik ze uitschakelen:

WIJZIG TABEL ConstraintTest NOCHECK CONSTRAINT ALLES;

Controleer of ze zijn uitgeschakeld:

SELECT OBJECT_NAME(parent_object_id) AS 'Table', naam AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraint;
 Resultaat:

+----------------+-----------------+----------- ----+------------------+| Tafel | beperking | is_disabled | is_not_trusted ||----------------+-----------------+------------ ---+------------------|| BeperkingTest | chkPrijs | 1 | 1 || BeperkingTest | chkValidEndDate | 1 | 1 || BeperkingTest | chkTeamSize | 1 | 1 || beroep | chkJobTitel | 0 | 0 |+----------------+-----------------+------------ ---+------------------+

Ze zijn dus weer uitgeschakeld.

Schakel ze nu opnieuw in met WITH NOCHECK :

WIJZIG TABEL ConstraintTest MET NOCHECK CONTROLEER ALLES;

Controleer nogmaals:

SELECT OBJECT_NAME(parent_object_id) AS 'Table', naam AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraint;
 Resultaat:

+----------------+-----------------+----------- ----+------------------+| Tafel | beperking | is_disabled | is_not_trusted ||----------------+-----------------+------------ ---+------------------|| BeperkingTest | chkPrijs | 0 | 1 || BeperkingTest | chkValidEndDate | 0 | 1 || BeperkingTest | chkTeamSize | 0 | 1 || beroep | chkJobTitel | 0 | 0 |+----------------+-----------------+------------ ---+------------------+

We kunnen zien dat de beperkingen met succes zijn ingeschakeld, maar deze keer blijven ze niet vertrouwd.

De beperkingen zijn niet vertrouwd omdat ze geen bestaande gegevens hebben gecontroleerd voordat ze werden ingeschakeld.

Dus de belangrijkste conclusie hier is, als je wilt dat je beperkingen worden vertrouwd, gebruik dan WITH CHECK wanneer u ze inschakelt.

Individuele beperkingen inschakelen

Als u niet alle beperkingen tegelijk wilt inschakelen, kunt u ze afzonderlijk inschakelen. Dit kan ook handig zijn als u wel alle beperkingen moet inschakelen, maar u andere instellingen moet gebruiken (bijv. WITH CHECK voor sommigen en WITH NOCHECK voor anderen).

Zie Hoe u een CHECK-beperking in SQL Server kunt inschakelen en Hoe u een externe sleutel in SQL Server kunt inschakelen.


  1. Datums vergelijken in SQL Server

  2. Voorloop- en volgnullen toevoegen in SQL Server

  3. Converteer efficiënt rijen naar kolommen in de sql-server

  4. Gebruikersaccountbeheer, rollen, machtigingen, authenticatie PHP en MySQL