segunda-feira, 13 de fevereiro de 2012

Descendentes de uma Tabela

O script SQL abaixo retorna, para uma tabela qualquer, todas as descendentes, ou seja, todas as tabelas que possuem constraints de integridade referencial (FKs) que apontem para ela em qualquer nível. É útil por exemplo em atividades de saneamento de dados, quando você precisa remover a pessoa com ID = 186413 mas existem dezenas de outras tabelas onde este ID é referenciado. Claro que o script só funciona se as FKs realmente existem na base de dados e estão ativas.


select nivel, parent_table_name, child_table_name, fkey_constraint
from   ( select max(level) nivel,
                parent_table_name,
                child_table_name,
                fkey_constraint
         from   ( select pk.table_name         parent_table_name,
                         pk.constraint_name    pkey_constraint,
                         fk.table_name         child_table_name,
                         fk.constraint_name    fkey_constraint,
                         fk.r_constraint_name
                  from   all_constraints pk,
                         all_constraints fk
                  where  pk.constraint_name = fk.r_constraint_name
                    and  pk.constraint_type in ('P','U')
                    and  fk.status = 'ENABLED'
                    and  fk.constraint_type = 'R'
                )
         start with parent_table_name = upper('&TABELA')
         connect by nocycle prior child_table_name = parent_table_name
         group by parent_table_name, child_table_name, fkey_constraint
       )
order by nivel
/

Nenhum comentário:

Postar um comentário