Consulta para obter todas as restrições de chave estrangeira no SQL Server 2000
-
06-07-2019 - |
Pergunta
Eu preciso de uma consulta para o SQL Server 2000 para obter uma lista de todas as chaves estrangeiras.
Particularmente todas as chaves estrangeiras que apontam para uma determinada coluna.
Como faço para escrever essa consulta?
Solução
select * from sysobjects
where xtype = 'F'
Isso deve fazer o truque e ser compatível com SQL Server 2000, eu espero!
Se precisar, adicionalmente, as informações da tabela e coluna em SQL Server 2000, ele fica um pouco mais envolvidos; você precisa para se juntar aos sysforeignkeys
e syscolumns
exibições do catálogo assim:
select
so.name 'foreign key name',
OBJECT_NAME(parent_obj) 'table',
OBJECT_NAME(sf.fkeyid) 'referencing table',
sc1.name 'referencing column',
OBJECT_NAME(sf.rkeyid) 'referenced table',
sc2.name 'referenced column'
from sysobjects so
inner join sysforeignkeys sf on so.id = sf.constid
inner join syscolumns sc1 on sf.fkeyid = sc1.id and sf.fkey = sc1.colid
inner join syscolumns sc2 on sf.rkeyid = sc2.id and sf.fkey = sc2.colid
where so.xtype in ('F','PK')
E se você quiser aproveitar as vistas INFORMATION_SCHEMA que são, de facto disponível em SQL Server 2000, use esta consulta:
SELECT
rc.CONSTRAINT_NAME,
rcu.TABLE_NAME 'Referencing Table',
rcu.COLUMN_NAME 'Referencing Column',
rcu1.TABLE_NAME 'Referenced Table',
rcu1.COLUMN_NAME 'Referenced Column'
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
INNER JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu
ON rc.CONSTRAINT_CATALOG = rcu.CONSTRAINT_CATALOG
AND rc.CONSTRAINT_NAME = rcu.CONSTRAINT_NAME
INNER JOIN
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE rcu1
ON rc.UNIQUE_CONSTRAINT_CATALOG = rcu1.CONSTRAINT_CATALOG
AND rc.UNIQUE_CONSTRAINT_NAME = rcu1.CONSTRAINT_NAME
Marc
Outras dicas
select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
Se precisar de mais informações sobre a chave, então você pode juntá-lo à vista INFORMATION_SCHEMA.KEY_COLUMN_USAGE, que contém as colunas referenciadas pela chave.
olhar para a fonte de sp_helpconstraint para mais idéias, mas isso deve funcionar ...
para obter cada FK que se refere a tabela de destino e coluna
- substituir "YourTableName"
- uncomment o último "E" e defina seu nome coluna de destino
código:
--list all tables & columns that refer to the given table
select
k.name,pt.Name AS ParentTable,pc.name,c.constraint_column_id,ct.Name AS ReferedToTable,c.referenced_column_id,cc.Name
from sys.foreign_keys k
INNER JOIN sys.foreign_key_columns c ON k.parent_object_id=c.parent_object_id
INNER JOIN sys.objects pt ON c.parent_object_id=pt.object_ID
INNER JOIN sys.objects ct ON c.referenced_object_id=ct.object_ID
INNER JOIN sys.columns pc ON c.parent_object_id=pc.object_ID AND c.parent_column_id=pc.column_id
INNER JOIN sys.columns cc ON c.referenced_object_id=cc.object_ID AND c.referenced_column_id=cc.column_id
where k.referenced_object_id = object_id('YourTableName')
--AND pc.name='YourColumnName' --parent table column name
--AND cc.name='YourColumnName' --referenced table's column name