In SQL Server kunt u Transact-SQL gebruiken om een lijst met alle externe sleutels te retourneren en CHECK
beperkingen voor de huidige database.
De voorbeelden op deze pagina vragen twee systeemweergaven om deze informatie op te halen:
sys.foreign_keys
en
sys.check_constraints
. U kunt elk afzonderlijk opvragen of UNION
. gebruiken om ze allemaal in een enkele resultatenset weer te geven.
Voorbeeld 1 – Gecombineerde resultatenset
In dit voorbeeld gebruik ik UNION
om buitenlandse sleutels terug te geven en CHECK
beperkingen in dezelfde resultaatset.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', naam AS 'Constraint', type_desc, is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, type_desc, is_disabled, is_not_trustedFROM;Resultaat:
+------------------+--------------------------- -----+------------------------+---------------+--- ---------------+| Tafel | beperking | type_desc | is_disabled | is_not_trusted ||------------------+---------------------------- ----+------------------------+---------------+---- --------------|| Bandlid | FK_BandMember_Band | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Bandlid | FK_BandMember_Musicus | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Stad | FK_City_Land | FOREIGN_KEY_CONSTRAINT | 0 | 0 || LidmaatschapPeriode | chkValidEndDate | CHECK_CONSTRAINT | 0 | 0 || LidmaatschapPeriode | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0 | 0 |+------------------+---------------------------- ----+------------------------+---------------+---- --------------+In dit geval bevat de huidige database vier externe sleutels en één
CHECK
beperking.We kunnen ook zien of elke beperking is ingeschakeld of uitgeschakeld, en of deze vertrouwd is of niet.
Voorbeeld 2 – Alle kolommen retourneren
Deze twee weergaven retourneren meer kolommen dan ik in dit voorbeeld heb vermeld. U kunt altijd een jokerteken gebruiken om alle kolommen te retourneren. Als u dit echter doet, kunt u
UNION
. niet gebruiken , omdat elke weergave een ander aantal kolommen retourneert.Daarom moet u ze afzonderlijk opvragen. Bijvoorbeeld:
SELECT * FROM sys.foreign_keys;SELECT * FROM sys.check_constraints;Dat levert twee resultaatsets op:één met de refererende sleutels, de andere met de
CHECK
beperkingen.Om ruimte te besparen, zal ik de resultaten van die zoekopdracht niet weergeven. Maar dit is wat de tweede regel produceert (met behulp van verticale uitvoer om te voorkomen dat u horizontaal hoeft te scrollen):
SELECT * FROM sys.check_constraints;Resultaat (met verticale uitvoer):
-[ RECORD 1 ]-------------------------naam | chkValidEndDateobject_id | 1525580473principal_id | NULLschema_id | 1ouder_object_id | 1349579846type | C type_desc | CHECK_CONSTRAINTcreate_date | 2019-09-11 00:33:02.587modify_date | 2019-09-11 00:33:02.587is_ms_shipped | 0is_published | 0is_schema_published | 0is_disabled | 0is_not_for_replicatie | 0is_not_trusted | 0ouder_kolom_id | 0definitie | ([Einddatum]>=[Begindatum])gebruikt_database_collation | 1is_system_named | 0U kunt elk van deze kolommen in uw zoekopdracht opnemen, maar als u deze combineert met de refererende sleutels, zorg er dan voor dat u dezelfde kolommen in beide weergaven opneemt.
De
sys.foreign_keys
view retourneert nog een paar kolommen. Hier is een aangepaste zoekopdracht, waarbij ik de eerste rij (op naam) uit die weergave terugstuur.SELECTEER TOP(1) * VANUIT sys.foreign_keysORDER OP naam;Resultaat (met verticale uitvoer):
-[ RECORD 1 ]-------------------------naam | FK_BandMember_Bandobject_id | 1317579732principal_id | NULLschema_id | 1ouder_object_id | 1285579618type | F type_desc | FOREIGN_KEY_CONSTRAINTcreate_date | 2019-08-17 15:58:42.027modify_date | 2019-08-17 15:58:42.027is_ms_shipped | 0is_published | 0is_schema_published | 0referenced_object_id | 1253579504key_index_id | 1is_disabled | 0is_not_for_replicatie | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTIONis_system_named | 0