2017-07-30 1 views
0

Dans StackOverflow, je peux trouver le post sur how to find all foreign key constraints in SQL Server.Comment trouver toutes les contraintes de clé étrangère dans Oracle?

Je ne peux trouver le post sur la façon de trouver toutes les contraintes de clé étrangère pour une table dans Oralce (List of foreign keys and the tables they reference).

Ma question est: Comment puis-je lister toutes les contraintes de clé étrangère pour toutes les tables, plutôt que pour une table dans Oracle. Ma réponse de désir sera quelque chose comme this one, mais pour Oracle.

P.S. J'utilise oralce 11g express edition. Mon outil de gestion d'interface graphique Oracle est le développeur Orace SQL.

Répondre

1

Je le ferais comme ça;

Si vous voulez Cumulés avec toutes les colonnes sur la même ligne

select distinct c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name, 
listagg(c2.column_name,',') WITHIN GROUP (ORDER BY C2.POSITION) OVER (PARTITION BY c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name) column_list 
from dba_constraints c1 
JOIN dba_cons_columns c2 
ON c1.R_CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.r_owner=c2.owner 
where C1.constraint_type = 'R' 

ou comme ça si vous voulez une ligne par colonne

select c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name, c2.column_name 
from dba_constraints c1 
JOIN dba_cons_columns c2 
ON c1.R_CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.r_owner=c2.owner 
where C1.constraint_type = 'R' 
order by c1.owner, c1.table_name, c1.constraint_name, c2.position 

ou si vous souhaitez référencer les détails de la colonne et les colonnes référencées détails

with constraint_colum_list as (select owner, table_name, constraint_name, listagg(column_name,',') WITHIN GROUP (order by position) as column_list 
           FROM DBA_CONS_COLUMNS GROUP BY owner, table_name, constraint_name) 
select distinct c1.owner, c1.table_name, c1.constraint_name, c2.column_list, c3.owner, c3.table_name, c3.constraint_name, c3.column_list 
from DBA_constraints c1 
JOIN constraint_colum_list c2 ON c1.CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.owner=c2.owner 
JOIN constraint_colum_list c3 ON C1.R_CONSTRAINT_NAME=C3.CONSTRAINT_NAME AND C1.R_OWNER=C3.owner 
where C1.constraint_type = 'R' 
-- AND c1.owner = 'YOUR_SCHEMA'; 
+0

Pour votre dernière solution, 'AND c1.owner =' YOUR_SCHEMA ';' Si le nom de connexion de mon développeur sql oracle est 'TestDemo', je dois donc faire 'AND c1.owner =' TestDemo ';' Ensuite, je peux seulement sortir les contraintes de clé étrangère que je spécifie/crée. Mais SQL Server n'a pas besoin de le faire, seul Oracle a besoin de cela? – EntryLeveDeveloper

+0

Ma réponse est basée sur le fait que vous avez demandé TOUTES les clés étrangères sur TOUTES les tables. Si vous êtes seulement intéressé par le vôtre, remplacez 'DBA_CONSTRAINTS' par' USER_CONSTRAINTS' et 'DBA_CONS_COLUMNS' par' USER_CONS_COLUMNS' et vous ne verrez que celui que vous possédez – LauDec

+0

Great. Ça marche. Puis-je savoir quels sont les autres résultats généralement utilisés en utilisant DBA_CONSTRAINTS?Je sais seulement que les contraintes de clé étrangère spécifiées par l'utilisateur/us sont utiles car je peux voir les relations entre les tables et les colonnes, donc je peux connaître le domaine d'activité du projet. – EntryLeveDeveloper

0

N'utilisez pas le nom de la table dans la condition où vous obtiendrez des contraintes FK pour toutes les tables.

SELECT A.TABLE_NAME, 
     A.COLUMN_NAME, 
     A.CONSTRAINT_NAME, 
     C.OWNER 
FROM ALL_CONS_COLUMNS A, 
     ALL_CONSTRAINTS C 
WHERE A.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
AND C.CONSTRAINT_TYPE = 'R' 
AND C.OWNER = 'MyDBLoginName'; 
+0

Je pense que je dois ajouter une condition where « ET C.OWNER = MyDBLoginName ». Sinon, si je n'utilise que votre code, il énumérera trop de colonnes dont C.OWNER est 'SYS', 'SYSTEM', 'HR', etc, ce qui n'est pas ce que je veux. – EntryLeveDeveloper

+0

Pouvez-vous également sortir la table référencée et la colonne de référence? – EntryLeveDeveloper

+0

ma solution le fait :) – LauDec

0

Cette réponse est basée sur la solution de LauDec.

Comme je ne besoin de toutes les clés étrangères spécifiées par moi/utilisateur, donc je vais utiliser SQL suivante:

with constraint_colum_list as (select owner, table_name, constraint_name, listagg(column_name,',') WITHIN GROUP (order by position) as column_list 
           FROM USER_CONS_COLUMNS GROUP BY owner, table_name, constraint_name) 
select distinct c1.owner, c1.table_name, c1.constraint_name, c2.column_list, c3.owner, c3.table_name, c3.constraint_name, c3.column_list 
from USER_CONSTRAINTS c1 
JOIN constraint_colum_list c2 ON c1.CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.owner=c2.owner 
JOIN constraint_colum_list c3 ON C1.R_CONSTRAINT_NAME=C3.CONSTRAINT_NAME AND C1.R_OWNER=C3.owner 
where C1.constraint_type = 'R';