2010-09-16 6 views
3

Y at-il une requête que je peux faire pour trouver quelles tables ont des clés étrangères sur une table donnée? Notre DBA ne croit pas (ou ne comprend pas?) "ON DELETE CASCADE", donc quand je supprime quelque chose d'une table, je veux m'assurer que je supprime toutes les choses dépendantes en premier.Comment trouver les tables contenant des clés étrangères sur ma table?

(Note, je ne ai pas besoin de trouver les tables programme, je peux le faire dans SQL * Plus.)

+0

C'est un bon bon DBA! –

+1

Semble plus "ne croit pas". ON DELETE CASCADE fait la même chose que regarder dans les contraintes et supprimer les enregistrements de référence. – Christian13467

+0

Cependant, ON DELETE CASCADE est notoirement lent; Si c'est un gros travail, il est généralement préférable de supprimer tous les enfants en premier. –

Répondre

2
SELECT dc.constraint_name, dc.constraint_type, dc.owner, dc.table_name 
FROM dba_cons_columns dcc 
JOIN dba_constraints dc ON (dcc.constraint_name = dc.r_constraint_name and dc.owner = dcc.owner) 
WHERE dcc.owner = 'OWNER_NAME' and dcc.table_name = 'TABLE_NAME'; 
+0

J'ai dû changer la deuxième ligne à 'DE dba_cons_columns dcc JOIN dba_constraints dc ON (dcc.constraint_name = dc.r_constraint_name et dc.owner = dcc.owner)' parce que plusieurs propriétaires ont les mêmes noms de contraintes. –

+0

Bonne prise. J'ai mis à jour ma réponse. Merci. –

1

Vérifiez all_constraints et all_cons_columns dictionnaires.

+0

Je ne vois pas de colonne dans ces dictionnaires qui vous indiquent à quelle table la clé étrangère est destinée, donc si je sélectionne * from all_constraints où table_name = 'CLIENT'' et me montre tous les index et contraintes sur 'CLIENT' , mais je ne peux pas trouver une requête qui me montre quelles tables ont une clé étrangère sur CLIENT. –

+0

Oh, mais si je sélectionne * from all_constraints où r_constraint_name = 'PK__CLIENT'' il fait ce que je veux. La plupart. –