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 deConstraintTest
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 enWITH 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.