In SQL Server puoi utilizzare Transact-SQL per restituire un elenco di tutte le chiavi esterne e CHECK
vincoli per il database corrente.
Gli esempi in questa pagina interrogano due viste di sistema per recuperare queste informazioni:
sys.foreign_keys
e
sys.check_constraints
. Puoi interrogare ciascuno separatamente o utilizzare UNION
per visualizzarli tutti in un unico set di risultati.
Esempio 1 – Insieme di risultati combinato
In questo esempio, utilizzo UNION
per restituire chiavi esterne e CHECK
vincoli nello stesso set di risultati.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', type_desc, is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, type_desc, is_disabled, is_not_trusted FROM sys.check_constraints;
Risultato:
+------------------+--------------------------------+------------------------+---------------+------------------+ | Table | Constraint | type_desc | is_disabled | is_not_trusted | |------------------+--------------------------------+------------------------+---------------+------------------| | BandMember | FK_BandMember_Band | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | BandMember | FK_BandMember_Musician | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | City | FK_City_Country | FOREIGN_KEY_CONSTRAINT | 0 | 0 | | MembershipPeriod | chkValidEndDate | CHECK_CONSTRAINT | 0 | 0 | | MembershipPeriod | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0 | 0 | +------------------+--------------------------------+------------------------+---------------+------------------+
In questo caso, il database corrente contiene quattro chiavi esterne e un CHECK
vincolo.
Possiamo anche vedere se ogni vincolo è abilitato o disabilitato, nonché se è attendibile o meno.
Esempio 2 – Restituisci tutte le colonne
Queste due visualizzazioni restituiscono più colonne di quelle elencate in questo esempio. Puoi sempre utilizzare un carattere jolly per restituire tutte le colonne. Tuttavia, se lo fai, non sarai in grado di utilizzare UNION
, perché ogni vista restituisce un numero diverso di colonne.
Pertanto, dovrai interrogarli separatamente. Ad esempio:
SELECT * FROM sys.foreign_keys; SELECT * FROM sys.check_constraints;
Ciò produrrà due set di risultati:uno contenente le chiavi esterne, l'altro contenente il CHECK
vincoli.
Per risparmiare spazio, non visualizzerò i risultati di quella query. Ma ecco cosa produce la seconda riga (usando l'output verticale per evitare di dover scorrere orizzontalmente):
SELECT * FROM sys.check_constraints;
Risultato (usando l'output verticale):
-[ RECORD 1 ]------------------------- name | chkValidEndDate object_id | 1525580473 principal_id | NULL schema_id | 1 parent_object_id | 1349579846 type | C type_desc | CHECK_CONSTRAINT create_date | 2019-09-11 00:33:02.587 modify_date | 2019-09-11 00:33:02.587 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 parent_column_id | 0 definition | ([EndDate]>=[StartDate]) uses_database_collation | 1 is_system_named | 0
Puoi includere una qualsiasi di queste colonne nella tua query, ma se la combini con le chiavi esterne, assicurati di includere le stesse colonne in entrambe le viste.
Il sys.foreign_keys
view restituisce alcune colonne in più. Ecco una query modificata, in cui restituisco la prima riga (per nome) da quella vista.
SELECT TOP(1) * FROM sys.foreign_keys ORDER BY name;
Risultato (usando l'output verticale):
-[ RECORD 1 ]------------------------- name | FK_BandMember_Band object_id | 1317579732 principal_id | NULL schema_id | 1 parent_object_id | 1285579618 type | F type_desc | FOREIGN_KEY_CONSTRAINT create_date | 2019-08-17 15:58:42.027 modify_date | 2019-08-17 15:58:42.027 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 referenced_object_id | 1253579504 key_index_id | 1 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 delete_referential_action | 0 delete_referential_action_desc | NO_ACTION update_referential_action | 0 update_referential_action_desc | NO_ACTION is_system_named | 0