Oracle: Referenzen zwischen Objekten finden

Wer kennt das nicht? Bei der Entwicklung neuer Funktionalitäten innerhalb einer Datenbank oder beim Refactoring stößt man auf Code, den man schon eine Weile nicht mehr angefasst hat. So fragt man sich dann zum Beispiel wo dieser eine View noch verwendet wird, oder welchen Zweck ein Package erfüllt.

Normalerweise sollte sämtlicher Code, auch Datenbankskripte, kommentiert sein und darüber Aufschluss geben wofür die programmierten Objekte dienen. Doch es kommt in der Praxis allzu häufig vor, dass man vor “fremdem” Code sitzt oder eine alte Software übernehmen oder analysieren muss.

In diesen Situationen, wenn die Kommentare mal wieder dürftig oder nicht vorhanden sind, hilft bei Oracle Datenbanken die tabelle user_dependencies. Dort findet man Informationen über die Beziehungen zwischen allen Datenbankobjekten, also welche Objekte werden von welchen anderen Objekten verwendet.

Beispiele zur Verwendung der Tabelle user_dependencies

– Zeige alle Beziehungen zwischen allen Datenbank-Objekten (Packages, Views, Tables, etc.).

SELECT * 
  FROM user_dependencies
;

– Wenn man an einer Tabelle Änderungen vorgenommen hat und dann alle davon betroffenen Views und/oder Packages ermitteln will, hilft diese Abfrage.

SELECT * 
  FROM user_dependencies
  WHERE UPPER(referenced_name) LIKE UPPER('Tabellenname')
;

– Zeige alle Packages die auf eine bestimmte Tabelle zugreifen (und dort evtl. Daten verändern)

SELECT *
  FROM user_dependencies
  WHERE 
    UPPER(referenced_name) LIKE UPPER('Tabellenname')
    AND type = 'PACKAGE BODY'
;

– Zeige alle Views, die wiederum auf andere Views verweisen

SELECT * 
  FROM user_dependencies
  WHERE referenced_type = 'VIEW'
  ORDER BY name
;

– Zeige alle Referenzen zwischen allen Views. Falls es bei diesem Select zu einem Fehler kommt, gibt es vermutlich Endlosschleifen durch Kreisverweise.

SELECT  name || SYS_CONNECT_BY_PATH(referenced_name, ' / ') "ABHAENGIGKEITS_PFAD", dep.*
  FROM user_dependencies dep
  WHERE referenced_type = 'VIEW'
  START WITH type = 'VIEW'
  CONNECT BY PRIOR referenced_name = name
ORDER BY name
;

social