Bonjour,

Je vous propose un nouvel élément à utiliser : Comment afficher le graph hiérarchique des contraintes d'intégrité référentielles liées à une table

Souvent, lors de l'insertion ou de la suppression dans une table, l'on se demande quelles sont les contraintes d'intégrité référentielles (Foreign Keys) existantes entre les tables



Les scripts joints dans le fichier references.zip permettent d'afficher pour une table le graph des contraintes d'intégrité référentielles, et donc, de savoir quelles tables liées par des clés étrangères doivent être valorisées pour une insertion, et dans quel ordre supprimer les données lors d'une suppression



le script reference.sql accepte deux paramètres (nom de la table, nom du schéma) et peut être lancé depuis une icône du bureau avec la syntaxe suivante :

\sqlplusw.exe user/pwd@base @reference.sql nom_table nom_schema

où depuis Sql*Plus avec la syntaxe suivante ;

@reference.sql nom_table nom_schéma



Pour les amateurs d'objets stockés dans la base, le script P_TRACE_FK rend le même service, sous forme de procédure stockée.

Cette procédure est appelée avec les syntaxes suivantes :

P_TRACE_FK( nom_table, nom_schéma );

ou

P_TRACE_FK( nom_table ) ; (le user connecté est pris par défaut)

avec l'utilisation de la procédure stockée, le tampon d'affichage doit être préalablement initialisé avec la commande : SET SERVEROUTPUT ON



Voici un exemple de sortie :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SQL*Plus: Release 9.2.0.1.0 - Production on Sa Oct 23 14:59:24 2004 
 
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 
 
 
 
Connecté à : 
 
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production 
 
With the Partitioning, OLAP and Oracle Data Mining options 
 
JServer Release 9.2.0.1.0 - Production 
 
 
 
-------------------------------------------------------------------- 
 
-- Contraintes d'intégrité référentielle de la Table : FD.LOV_LOV --
 
-------------------------------------------------------------------- 
 
LOV_LOV référencée par : 1 -> Item_Id.LOV_ITEM 
 
___ LOV_ITEM référencée par : 1 -> Module.LOV_BLOCK 
 
___ LOV_ITEM référencée par : 2 -> Bloc.LOV_BLOCK 
 
______ LOV_BLOCK référencée par : 1 -> Mod_Nom_Module.LOV_MODULE 
 
-------------------------------------------------------------------------------- 
 
LOV_LOV référence : 1 -> Id.LOV_COLONNE (NO ACTION) 
 
LOV_LOV référence : 1 -> Id.LOV_ELEMENT_COLONNE (NO ACTION)
 
 
 
Procédure PL/SQL terminée avec succès. 
 
 
 
SQL>


Où l'on voit clairement que pour supprimer une ligne dans la table LOV_MODULE il faut préalablement supprimer les fils de la table LOV_LOV puis ceux de la table LOV_ITEM puis ceux de la table LOV_BLOCK.

Et de la même façon, pour ajouter un enregistrement dans la table LOV_LOV, il faut qu'un parent existe dans la table LOV_ITEM, ayant elle-même un parent dans la table LOV_BLOCK elle-même fille de la table LOV_MODULE.

Qu'en pensez-vous ?