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.
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:
// 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;
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'