I SQL Server kan du bruge Transact-SQL til at returnere en liste over alle fremmednøgler og CHECK
begrænsninger for den aktuelle database.
Eksemplerne på denne side forespørger to systemvisninger for at hente disse oplysninger:
sys.foreign_keys
og
sys.check_constraints
. Du kan forespørge hver enkelt separat eller bruge UNION
for at vise dem alle i et enkelt resultatsæt.
Eksempel 1 – Kombineret resultatsæt
I dette eksempel bruger jeg UNION
for at returnere fremmednøgler og CHECK
begrænsninger i det samme resultatsæt.
VÆLG OBJECT_NAME(parent_object_id) AS 'Table', name 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>Resultat:
+-------------------+-------------------------------- -----+------------------------+--------------+--- ---------------+| Tabel | Begrænsning | type_desc | er_deaktiveret | er_ikke_pålidelig ||----------------+-------------------------------- ----+------------------------+---------------+---- --------------|| Bandmedlem | FK_BandMember_Band | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Bandmedlem | FK_BandMember_Musician | FOREIGN_KEY_CONSTRAINT | 0 | 0 || By | FK_City_Country | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Medlemskabsperiode | chkValidEndDate | CHECK_CONSTRAINT | 0 | 0 || Medlemskabsperiode | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0 | 0 |+-------------------+---------------------------- ----+------------------------+---------------+---- --------------+I dette tilfælde indeholder den aktuelle database fire fremmednøgler og en
CHECK
begrænsning.Vi kan også se, om hver begrænsning er aktiveret eller deaktiveret, samt om den er tillid til eller ej.
Eksempel 2 – Returner alle kolonner
Disse to visninger returnerer flere kolonner, end jeg har angivet i dette eksempel. Du kan altid bruge et jokertegn til at returnere alle kolonner. Men hvis du gør dette, vil du ikke være i stand til at bruge
UNION
, fordi hver visning returnerer et forskelligt antal kolonner.Derfor skal du forespørge dem separat. For eksempel:
SELECT * FROM sys.foreign_keys;SELECT * FROM sys.check_constraints;Det vil producere to resultatsæt:det ene indeholder fremmednøglerne, det andet indeholder
CHECK
begrænsninger.For at spare plads vil jeg ikke vise resultaterne af den forespørgsel. Men her er, hvad den anden linje producerer (ved at bruge lodret output for at spare dig for at skulle rulle vandret):
VÆLG * FRA sys.check_constraints;Resultat (ved hjælp af lodret output):
-[ RECORD 1 ]-------------------------navn | chkValidEndDateobject_id | 1525580473principal_id | NULLschema_id | 1forælder_objekt-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 | 0er_udgivet | 0is_schema_published | 0is_disabled | 0er_ikke_til_replikering | 0is_not_trusted | 0parent_column_id | 0 definition | ([EndDate]>=[StartDate])bruger_database_sortering | 1is_system_named | 0Du kan inkludere enhver af disse kolonner i din forespørgsel, men hvis du kombinerer den med fremmednøglerne, skal du sørge for at inkludere de samme kolonner på tværs af begge visninger.
sys.foreign_keys
visning returnerer et par kolonner mere. Her er en ændret forespørgsel, hvor jeg returnerer den første række (efter navn) fra den visning.SELECT TOP(1) * FROM sys.foreign_keysORDER BY name;Resultat (ved hjælp af lodret output):
-[ RECORD 1 ]-------------------------navn | FK_BandMember_Bandobject_id | 1317579732principal_id | NULLschema_id | 1forælder_objekt-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 | 0er_udgivet | 0is_schema_published | 0referenced_object_id | 1253579504key_index_id | 1er_deaktiveret | 0er_ikke_til_replikering | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTION er_systemnavnet | 0