Comment puis-je trouver quelles tables de référence une table donnée dans Oracle SQL Developer?
dans Oracle SQL Developer , si je regarde les informations sur une table, je peux voir les contraintes, qui me permettent de voir les clés étrangères (et donc quelles tables sont référencées par cette table), et je peux voir les dépendances pour voir quels paquets et telle référence la table. Mais je ne sais pas comment trouver quels tableaux font référence à la table.
par exemple, dites que je regarde la table emp
. Il y a une autre table emp_dept
qui saisit quels employés travaillent dans quels ministères, qui renvoie au tableau emp
par emp_id
, la clé principale du tableau emp
. Y a-t-il un moyen (par le biais d'un élément D'interface utilisateur dans le programme, et non par le biais de SQL) de trouver que la table emp_dept
renvoie à la table emp
, sans que je sache que la table emp_dept
existe?
7 réponses
Pas de. Il n'y a pas d'option de ce type Disponible chez Oracle SQL Developer.
vous devez exécuter une requête à la main ou utiliser un autre outil (par exemple PLSQL Developer dispose d'une telle option). Le SQL suivant est celui utilisé par le développeur PLSQL:
select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = :r_table_name
and owner = :r_owner
)
order by table_name, constraint_name
où r_owner
est le schéma, et r_table_name
est le tableau pour lequel vous cherchez des références. Les noms sont sensibles à la casse
soyez prudent parce que dans L'onglet Rapports du développeur Oracle SQL il y a l'option" Toutes les tables / dépendances "c'est à partir de ALL_DEPENDENCIES qui se réfère à " dépendances entre les procédures, les paquets, les fonctions, les corps de paquet, et les déclencheurs accessibles à l'utilisateur courant, y compris les dépendances sur les vues créées sans liens de base de données." . Alors, ce rapport n'a aucune valeur pour votre question.
pour ajouter ceci à SQL Developer comme extension, faites ce qui suit:
- sauvegardez le code ci-dessous dans un fichier xml (p. ex.xml):
<items>
<item type="editor" node="TableNode" vertical="true">
<title><![CDATA[FK References]]></title>
<query>
<sql>
<![CDATA[select a.owner,
a.table_name,
a.constraint_name,
a.status
from all_constraints a
where a.constraint_type = 'R'
and exists(
select 1
from all_constraints
where constraint_name=a.r_constraint_name
and constraint_type in ('P', 'U')
and table_name = :OBJECT_NAME
and owner = :OBJECT_OWNER)
order by table_name, constraint_name]]>
</sql>
</query>
</item>
</items>
-
ajouter l'extension à SQL Developer:
- Outils > Préférences
- Base De Données > Extensions Définies Par L'Utilisateur
- , Cliquez sur "Ajouter une Ligne" bouton
- En Type choisissez "Editeur", L'emplacement est l'endroit où vous avez enregistré le fichier xml au-dessus de
- cliquez sur "Ok" puis redémarrez SQL Developer
-
naviguez vers n'importe quelle table et vous devriez maintenant voir un onglet supplémentaire à côté de SQL one, intitulé FK References, qui affiche les nouvelles informations FK.
-
référence
remplacer [votre tableau] par emp dans la requête ci-dessous
select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name in (select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='[YOUR TABLE]');
vous pouvez être en mesure d'interroger ce à partir de la ALL_CONSTRAINTS
vue:
SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
AND r_constraint_name IN
( SELECT constraint_name
FROM ALL_CONSTRAINTS
WHERE table_name = 'EMP'
AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
);
SQL Developer 4.1, publié en mai 2015, a ajouté un onglet modèle qui montre les clés étrangères de table qui se réfèrent à votre table dans un format de diagramme de relation D'entité.
Que Diriez-vous de quelque chose comme ceci:
SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
WHERE c.table_name = <TABLE_OF_INTEREST>
AND c.constraint_TYPE = 'R';
SELECT DISTINCT table_name,
constraint_name,
column_name,
r_table_name,
position,
constraint_type
FROM (SELECT uc.table_name,
uc.constraint_name,
cols.column_name,
(SELECT table_name
FROM user_constraints
WHERE constraint_name = uc.r_constraint_name) r_table_name,
(SELECT column_name
FROM user_cons_columns
WHERE constraint_name = uc.r_constraint_name
AND position = cols.position) r_column_name,
cols.position,
uc.constraint_type
FROM user_constraints uc
inner join user_cons_columns cols
ON uc.constraint_name = cols.constraint_name
WHERE constraint_type != 'C')
START WITH table_name = '&&tableName'
AND column_name = '&&columnName'
CONNECT BY NOCYCLE PRIOR table_name = r_table_name
AND PRIOR column_name = r_column_name;