Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Restituisce tutte le chiavi esterne e CONTROLLA i vincoli in un database di SQL Server (esempi T-SQL)

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