Dependencias e relacionameto das tabelas nas Systems Tables

Firebird

19/09/2008

Ola

Estou precisando de listar a dependencia das tabelas do FireBird 1.5
Como no Ib_Expert q lista as tabelas que dependem e as tabelas que estao relacionadas com uma determinada tabela... ( guia DEPENDENCIES)

Por exemplo: Tabelas [b:5faadbe070]Nota_Fiscal[/b:5faadbe070], [b:5faadbe070]Itens_nota_fiscal[/b:5faadbe070], [b:5faadbe070]usuario[/b:5faadbe070]

Atraves de uma consulta sql nas systems tables da para saber por exemplo que a tabela Itens_nota [b:5faadbe070]depende [/b:5faadbe070]da tabela Nota_fiscal (a consulta esta no final) e que a tabela Notas_fiscal [b:5faadbe070]depende [/b:5faadbe070]da tabela Usuario...

O que eu precisava era o contrario. Saber q a tabela Usuario[b:5faadbe070] tem referencia[/b:5faadbe070] na tabela Notas_Fiscal. Que a tabela Nota_fiscal [b:5faadbe070]tem referencia[/b:5faadbe070] na tabela Itens_nota...

Tudo isso passando como parametro o nome da tabela
Bom é isso.
Cheguei bem perto de conseguir mas axo q me embolei no entendimento das Systems Tables.

O motivo disso tudo é que estou fazendo uma pequena sincronização entre algumas filiais e preciso saber a sequencia correta de inserir novos dados nas tabelas sem causar erro de chave.
E sempre é bom conhecer mais a fundo como o BD Funciona rsss

Quem puder me dar uma ajuda.
Valeu

/*===========================================
Recupera as tabelas que a tabela passada no paramentro depende
=============================================*/

SELECT RDB$REF_CONSTRAINTS.rdb$constraint_name as Nome_Constrait ,
RDB$REF_CONSTRAINTS.rdb$const_name_uq as Indice_Chave_Primaria,
RDB$INDICES.RDB$RELATION_NAME AS NOME_TABELA,
RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS chave_primaria
FROM RDB$REF_CONSTRAINTS
INNER JOIN RDB$INDICES ON ( RDB$INDICES.RDB$INDEX_NAME = RDB$REF_CONSTRAINTS.rdb$const_name_uq )
INNER JOIN RDB$INDEX_SEGMENTS ON (RDB$INDEX_SEGMENTS.rdb$index_name = RDB$INDICES.rdb$index_name)
WHERE RDB$REF_CONSTRAINTS.RDB$CONSTRAINT_NAME IN

(
SELECT rdb$constraint_name
FROM RDB$RELATION_CONSTRAINTS
WHERE RDB$RELATION_CONSTRAINTS.rdb$relation_name= :VARtabela
AND rdb$constraint_type=´FOREIGN KEY´

)


Colerapunk

Colerapunk

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

19/09/2008

utilize a tabela RDB$DEPENDENCIES


GOSTEI 0
Colerapunk

Colerapunk

19/09/2008

Intao.. fiz algumas modificações na Sql Acima e consegui pegar todas as tabelas relacionadas com a tabela passada como parametro. Tanto as tabela q sao referenciadas quanto as tabelas q referenciam

Axo que agora esta certo. vou fazer alguns testes se der algum problema eu volto a postar

Encontrei algumas dicas aki, para quem interessar
http://www.alberton.info/firebird_sql_meta_info.html



/*===========================================
Recupera os nomes das tabelas relacionadas com a
tabela passada como parametro,
As partes comentadas sao outras informações que eu nao
precisei no momneto.. mas deixei ai no codigo para quem
quiser dar uma olhada

Mais dicas em http://www.alberton.info/firebird_sql_meta_info.html
=============================================*/


SELECT DISTINCT d2.RDB$DEPENDED_ON_NAME AS TABELA
-- , rc.RDB$CONSTRAINT_NAME AS ´constraint_name´
-- , rc.RDB$RELATION_NAME AS ´on table´
-- , d1.RDB$FIELD_NAME AS ´on field´
-- , d2.RDB$DEPENDED_ON_NAME AS ´references table´
-- , d2.RDB$FIELD_NAME AS ´references field´
-- , refc.RDB$UPDATE_RULE AS ´on update´
-- , refc.RDB$DELETE_RULE AS ´on delete´

FROM RDB$RELATION_CONSTRAINTS rc
LEFT JOIN RDB$REF_CONSTRAINTS refc ON rc.RDB$CONSTRAINT_NAME = refc.RDB$CONSTRAINT_NAME
LEFT JOIN RDB$DEPENDENCIES d1 ON d1.RDB$DEPENDED_ON_NAME = rc.RDB$RELATION_NAME
LEFT JOIN RDB$DEPENDENCIES d2 ON d1.RDB$DEPENDENT_NAME = d2.RDB$DEPENDENT_NAME

WHERE
d1.RDB$DEPENDED_ON_NAME <> d2.RDB$DEPENDED_ON_NAME
AND rc.RDB$RELATION_NAME = :VARtabela
AND RDB$DEPENDENCIES.RDB$FIELD_NAME IS NOT NULL


GOSTEI 0
POSTAR