sql >> Databasteknik >  >> RDS >> Sqlserver

Returnera alla främmande nycklar &KONTROLLERA begränsningar i en SQL Server-databas (T-SQL-exempel)

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 | 0

Du 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

  1. 7 sätt att returnera alla tabeller med en primärnyckel i SQL Server

  2. När ska man använda MyISAM och InnoDB?

  3. SQL Server rekursiv självanslutning

  4. SSIS-uppgift för import av inkonsekvent kolumnantal?