Eu quero uma maneira de estabelecer quais colunas em um determinado banco de dados são unidas por meio de relacionamentos PK/FK. Eu posso retornar as informações PK/FK para uma determinada tabela via
SELECT *
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS cu
WHERE EXISTS (
SELECT tc.*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
WHERE tc.CONSTRAINT_CATALOG = 'MyDatabase'
AND tc.TABLE_NAME = 'MyTable'
/*AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'*/
AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME);
GO
mas para um PK retornado de tal consulta, como faço para estabelecer o FK associado (supondo que haja um)?
Eu sei que você também pode obter as tabelas referenciadas via:
SELECT CONSTRAINT_NAME = name,
FOREIGN_SCHEMA = OBJECT_SCHEMA_NAME(parent_object_id),
FOREIGN_TABLE = OBJECT_NAME(parent_object_id),
REFERENCED_SCHEMA = OBJECT_SCHEMA_NAME(referenced_object_id),
REFERENCED_TABLE = OBJECT_NAME(referenced_object_id)
FROM sys.foreign_keys
WHERE OBJECT_NAME(referenced_object_id) = 'MyTable';
GO
mas estou lutando agora para obter as referências de coluna explícitas.
Estou criando um gerador de script para o QlikView. Para gerar o script, preciso das restrições e dos links associados. Eu preciso de todas as informações de restrição para qualquer coluna (se houver).
Eu quero construir uma classe de banco de dados que contenha todas as informações de um determinado banco de dados. Essa estrutura de classe database.table.column.constraints
será usada para obter as correspondências entre diferentes colunas em PK/FKs.
Claramente algumas colunas terão apenas FKs e neste caso eu também quero recuperar as informações de PK da chave correspondente; alguns terão apenas PKs e aí eu quero o inverso. Alguns, claro, podem ter ambos.