Tool zur 'used by / uses'-Analyse einer Oracle-DB

Hallo allerseits,

ich habe hier eine (zumindest für mich) relativ komplexe Oracle Datenbank mit ca. 100 Tabellen und 150 Views. Um die Abhängigkeiten mal zu analysieren bin ich auf der Suche nach einem Freeware Tool (oder zumindest kostenlos für Forschung & Lehre), dass mir anzeigen kann welche View welche anderen Views und Tabellen nutzt, da mir das langsam über den Kopf wächst.
Ich kannte sowas mal von dem Programm „Toad“ von QuestSoftware, aber das ist nicht mehr als Freeware erhältlich. Das konnte diese Dependencies (Abhängigkeiten) auflösen und als Baum darstellen. Ist das denn so schwer oder warum können ansonsten sehr gute Programme wie z.B. das „AquaDataStudio“ oder der Oracle eigene „SQL Developer“ sowas nicht.

Vielen Dank im Voraus für Tipps zu guten Programmen,
Christian

Hi,
die Abhängigkeiten bekommst du über die View
user_dependencies raus (für das eigene Schema) wie üblich gibt es da auch eine all und dba Variante von.

Die Abhängigkeiten sind aber nur auf Objekt ebene, d.h. insbesondere sind keine Abhängigkeiten einzelner Funktionen/Prozeduren in Packages dargestellt.

Für das visualisieren kann man sich notfalls damit behelfen, dass ganze in ein xml-format zu bringen und mit yed anzuzeigen.

Jens

Hallo und erstmal vielen Dank an Jens.
Dein Tipp hat mir entscheidend weitergeholfen. Inzwischen habe ich zwar eine Menge visualisierende Tools gefunden, aber eines, dass meine Wünsche 100% erfüllt leider noch nicht.

Inzwischen habe ich meine PL/SQL Kenntnisse etwas erweitert und mir folgende Behelfslösung gebastelt:

/*###############################################################################

Name: PROC_USER_DEPENDENCIES

Aufgabe: stellt die Abhängigkeiten zwischen Tabellen und Views dar

Author: Christian Graf

Datum: 2006-12-19

###############################################################################*/

DECLARE

// DIESE VARIABLE ÄNDERN UM ABHÄNGIGKEITEN DARZUSTELLEN:
qry_name VARCHAR2(50) := ‚QRY_MAINDATA‘;

PROCEDURE showUsedBy (objName IN VARCHAR2, tiefe IN NUMBER DEFAULT ‚0‘) IS
BEGIN
FOR resultrow IN (SELECT NAME FROM user_dependencies WHERE REFERENCED_NAME = objName)
LOOP
FOR i IN 1…tiefe LOOP
dbms_output.put(’ ’ );
END LOOP;
dbms_output.put_line(resultrow.NAME);
showUsedBy(resultrow.NAME, tiefe + 1);
END LOOP;
END;

PROCEDURE showUses (objName IN VARCHAR2, tiefe IN NUMBER DEFAULT ‚0‘) IS
BEGIN
FOR resultrow IN (SELECT REFERENCED_NAME FROM user_dependencies WHERE NAME = objName)
LOOP
FOR i IN 1…tiefe LOOP
dbms_output.put(’ ’ );
END LOOP;
dbms_output.put_line(resultrow.REFERENCED_NAME);
showUses(resultrow.REFERENCED_NAME, tiefe + 1);
END LOOP;
END;

BEGIN

dbms_output.put_line(’’);
showUses(qry_name, 1);
dbms_output.put_line(’’);
showUsedBy(qry_name, 1);

END;

Vielleicht hilft das ja mal jemandem, der auf der Suche nach etwas ähnlichem ist.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi!

Und so würde es ohne eigener Prozedur funktionieren:

select name||' ist abhängig von '||referenced\_name||' auf Ebene '||to\_char(level)
 FROM user\_dependencies
 CONNECT BY name = prior referenced\_name
 start with name = '&&v\_name'
union all
select referenced\_name||' hat Abhängigkeit von '||name||' auf Ebene '||to\_char(level)
 FROM user\_dependencies
 CONNECT BY prior name = referenced\_name
 start with referenced\_name = '&&v\_name'

Grüße,
Tomh