2009-07-23 8 views
17

J'ai hérité d'un schéma, donc je n'ai pas une connaissance complète de ce qui existe.Oracle toutes les références de clé étrangère

J'ai une table de projet avec un ID de projet. Il y a beaucoup d'autres tables qui référencent cette table par identifiant de projet. Ce que je veux faire est de lancer une requête pour établir:

  1. Quelles tables ont des références clés étrangères à la table de projet sur l'ID du projet
  2. Quelles tables ont une colonne appelée id projet (en cas clés étrangères ne sont pas configurés).

Si c'était SQL Server, je sais comment interroger les métadonnées, mais comment faire cela dans Oracle?

Répondre

22

1)

select table_name 
    from all_constraints 
where r_constraint_name = [your pk/uk constraint on PROJECTS(id)] 

2)

select table_name 
    from all_tab_columns 
where column_name = 'PROJECT_ID' 

Vous pouvez ajouter un prédicat supplémentaire contenant la colonne OWNER.

Cordialement, Rob.

1

1): SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME='R' and R_CONSTRAINT_NAME='xxx'

où xxx est le nom de la contrainte de clé primaire sur la table de projet

2): SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME='PROJECT_ID'

+1

Les contraintes de clé étrangère peuvent potentiellement traverser les schémas, donc je ne voudrais pas utiliser user_constraints. Idem pour les user_tab_columns. –

+0

Rob: Cela dépend vraiment. Dans mon environnement, l'utilisateur _... suffit, all_tab_columns donnerait des résultats trompeurs. –

+1

ammoQ: vrai, ça dépend. user _... pourrait suffire. Mais voir le titre du fil: "Toutes les références de clés étrangères" ... –

0

Les réponses r_constraint_name ici ne semble pas fonctionner pour moi, ne sais pas pourquoi que je suis nouveau à Oracle moi-même, mais cela a fonctionné:

SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>'; 
18

Ok. Voici une demande qui vous donnent la table référencée et de la colonne:

SELECT 
c_list.CONSTRAINT_NAME as NAME, 
substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN, 
c_dest.TABLE_NAME as DEST_TABLE, 
substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN 
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest 
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME 
AND c_list.OWNER    = c_src.OWNER 
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME 
AND c_list.OWNER    = c_dest.OWNER 
AND c_list.CONSTRAINT_TYPE = 'R' 
AND c_src.OWNER  = '<your-schema-here>' 
AND c_src.TABLE_NAME = '<your-table-here>' 
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME, 
    c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME; 

qui vous donnent quelque chose comme ceci:

NAME     |SRC_COLUMN  |DEST_TABLE   | DEST_COLUMN 
----------------------|----------------|----------------------|----------- 
CFK_RUB_FOR   |FOR_URN   |T03_FORMAT   |FOR_URN 
CFK_RUB_RUB   |RUB_RUB_URN  |T01_RUBRIQUE   |RUB_URN 
CFK_RUB_SUP   |SUP_URN   |T01_SUPPORT   |SUP_URN 
CFK_RUB_PRD   |PRD_URN   |T05_PRODUIT   |PRD_URN 

Vous pouvez oublier la fonction substr() si le résultat est utilisable sans. Ce n'est pas mon cas.

0

Mon problème était légèrement différent. J'ai une table et je voulais savoir par programme quelles autres tables/colonnes il référence.

J'ai commencé avec la réponse de Stan ci-dessus, mais cela ne me donne pas exactement ce que je avais besoin, alors je suis venu avec ce que je poste ici au cas où quelqu'un d'autre a mon problème:

WITH src as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND ac.constraint_type = 'R' 
    AND ac.table_name = '<src_table>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position), 
dst as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position) 
SELECT src.table_name as src_table, 
     dst.table_name as dst_table, 
     src.constraint_name as src_constraint, 
     src.column_name as src_column, 
     dst.column_name as dst_column, 
     src.position as position 
    FROM src,dst 
WHERE src.r_constraint_name = dst.constraint_name 
    AND src.position = dst.position 
0

Utilisez cette question.

select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME 
    from all_constraints b, all_cons_columns a 
    where r_constraint_name = 'Constraint_Name' and a.CONSTRAINT_NAME=b.CONSTRAINT_NAME; 
Questions connexes