I SQL Server kan du använda Transact-SQL för att returnera en lista över alla främmande nycklar och CHECK
begränsningar för den aktuella databasen.
Exemplen på den här sidan frågar efter två systemvyer för att hämta denna information:
sys.foreign_keys
och
sys.check_constraints
. Du kan fråga var och en separat eller använda UNION
för att visa dem alla i en enda resultatuppsättning.
Exempel 1 – Kombinerad resultatuppsättning
I det här exemplet använder jag UNION
för att returnera främmande nycklar och CHECK
begränsningar i samma resultatuppsättning.
VÄLJ 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:
+------------------+-------------------------------- -----+------------------------+--------------+--- ---------------+| Tabell | Begränsning | typ_desc | is_disabled | is_not_trusted ||------------------------+-------------------------------- ----+------------------------+---------------+---- --------------|| Bandmedlem | FK_BandMember_Band | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Bandmedlem | FK_BandMember_Musician | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Stad | FK_City_Country | FOREIGN_KEY_CONSTRAINT | 0 | 0 || Medlemskapsperiod | chkValidEndDate | CHECK_CONSTRAINT | 0 | 0 || Medlemskapsperiod | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0 | 0 |+-------------------+---------------------------- ----+------------------------+---------------+---- --------------+I detta fall innehåller den aktuella databasen fyra främmande nycklar och en
CHECK
begränsning.Vi kan också se om varje begränsning är aktiverad eller inaktiverad, samt om den är pålitlig eller inte.
Exempel 2 – Returnera alla kolumner
Dessa två vyer returnerar fler kolumner än jag har listat i det här exemplet. Du kan alltid använda ett jokertecken för att returnera alla kolumner. Men om du gör detta kommer du inte att kunna använda
UNION
, eftersom varje vy returnerar olika antal kolumner.Därför måste du fråga dem separat. Till exempel:
SELECT * FROM sys.foreign_keys;SELECT * FROM sys.check_constraints;Det ger två resultatuppsättningar:en som innehåller främmande nycklar, den andra innehåller
CHECK
begränsningar.För att spara utrymme kommer jag inte att visa resultaten av den frågan. Men här är vad den andra raden producerar (med vertikal utdata för att rädda dig från att behöva rulla horisontellt):
SELECT * FROM sys.check_constraints;Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------namn | chkValidEndDateobject_id | 1525580473principal_id | NULLschema_id | 1parent_object_id | 1349579846typ | C typ_desc | CHECK_CONSTRAINTcreate_date | 2019-09-11 00:33:02.587modify_date | 2019-09-11 00:33:02.587is_ms_shipped | 0is_publicerad | 0is_schema_published | 0is_disabled | 0är_inte_för_replikering | 0is_not_trusted | 0parent_column_id | 0 definition | ([EndDate]>=[StartDate])använder_databas_kollation | 1is_system_named | 0Du kan inkludera vilken som helst av dessa kolumner i din fråga, men om du kombinerar den med främmande nycklar, se till att inkludera samma kolumner i båda vyerna.
sys.foreign_keys
vyn returnerar några fler kolumner. Här är en modifierad fråga, där jag returnerar den första raden (efter namn) från den vyn.SELECT TOP(1) * FROM sys.foreign_keysORDER BY name;Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------namn | FK_BandMember_Bandobject_id | 1317579732principal_id | NULLschema_id | 1parent_object_id | 1285579618typ | F typ_desc | FOREIGN_KEY_CONSTRAINTcreate_date | 2019-08-17 15:58:42.027modify_date | 2019-08-17 15:58:42.027is_ms_shipped | 0is_publicerad | 0is_schema_published | 0referenced_object_id | 1253579504key_index_id | 1is_disabled | 0är_inte_för_replikering | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTION heter_systemet | 0