Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retornar todas as chaves estrangeiras e verificar restrições em um banco de dados SQL Server (exemplos T-SQL)


No SQL Server, você pode usar o Transact-SQL para retornar uma lista de todas as chaves estrangeiras e CHECK restrições para o banco de dados atual.

Os exemplos nesta página consultam duas visualizações do sistema para recuperar essas informações: sys.foreign_keys e sys.check_constraints . Você pode consultar cada um separadamente ou usar UNION para exibi-los todos em um único conjunto de resultados.


Exemplo 1 - Conjunto de resultados combinados


Neste exemplo, eu uso UNION para retornar chaves estrangeiras e CHECK restrições no mesmo conjunto de resultados.
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;

Resultado:
+------------------+--------------------------------+------------------------+---------------+------------------+
| 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                |
+------------------+--------------------------------+------------------------+---------------+------------------+

Neste caso, o banco de dados atual contém quatro chaves estrangeiras e um CHECK limitação.

Também podemos ver se cada restrição está habilitada ou desabilitada, bem como se é confiável ou não.

Exemplo 2 – Retornar todas as colunas


Essas duas visualizações retornam mais colunas do que listei neste exemplo. Você sempre pode usar um curinga para retornar todas as colunas. No entanto, se você fizer isso, não poderá usar UNION , porque cada exibição retorna um número diferente de colunas.

Portanto, você precisará consultá-los separadamente. Por exemplo:
SELECT * FROM sys.foreign_keys;
SELECT * FROM sys.check_constraints;

Isso produzirá dois conjuntos de resultados:um contendo as chaves estrangeiras, o outro contendo o CHECK restrições.

Para economizar espaço, não exibirei os resultados dessa consulta. Mas aqui está o que a segunda linha produz (usando saída vertical para evitar que você tenha que rolar horizontalmente):
SELECT * FROM sys.check_constraints;

Resultado (usando saída vertical):
-[ 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

Você pode incluir qualquer uma dessas colunas em sua consulta, mas se você combiná-la com as chaves estrangeiras, certifique-se de incluir as mesmas colunas em ambas as visualizações.

As sys.foreign_keys view retorna mais algumas colunas. Aqui está uma consulta modificada, onde eu retorno a primeira linha (por nome) dessa visualização.
SELECT TOP(1) * 
FROM sys.foreign_keys
ORDER BY name;

Resultado (usando saída vertical):
-[ 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