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