Die billigere Lösung als ‚Dependency Tracker‘ ist die Data-Dictionary-Tabelle sys.sql_dependencies, die aus dem diese Daten sein kann aus dem Datenwörterbuch abgefragt. Oracle verfügt über eine Data Dictionary-Ansicht mit ähnlicher Funktionalität namens DBA_DEPENDENCIES (plus entsprechende USER_- und ALL_-Ansichten). Mit den anderen Data-Dictionary-Tabellen (sys.tables/DBA_TABLES) usw. können Sie Beziehungsberichte erstellen.
Wenn Sie besonders interessiert sind, können Sie eine rekursive Abfrage verwenden (Oracle CONNECT BY oder SQL Server Common Table Expressions), um ein vollständiges Objektabhängigkeitsdiagramm zu erstellen.
Hier ist ein Beispiel für eine rekursive CTE auf sys.sql_dependencies. Es wird einen Eintrag für jede Abhängigkeit mit seiner Tiefe zurückgeben. Elemente können für jede Abhängigkeitsbeziehung mehr als einmal, möglicherweise in unterschiedlichen Tiefen, auftreten. Ich habe keine funktionierende Oracle-Instanz zur Hand, um eine CONNECT BY-Abfrage für DBA_DEPENDENCIES zu erstellen, sodass jeder, der über Bearbeitungsberechtigungen sowie die Zeit und das Fachwissen verfügt, diese Anmerkung kommentieren oder bearbeiten kann.
Hinweis auch mit sys.sql_dependencies
, dass Sie Spaltenreferenzen von referenced_minor_id
erhalten können. Dies könnte (zum Beispiel) verwendet werden, um zu bestimmen, welche Spalten in den ETL-Sprocs aus einem Bereitstellungsbereich tatsächlich verwendet wurden, wobei Kopien der DB-Tabellen aus der Quelle mit mehr Spalten als tatsächlich verwendet wurden.
with dep_cte as (
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
where d.referenced_minor_id in (0,1)
and not exists
(select 1
from sys.sql_dependencies d2
where d2.referenced_major_id = d.object_id)
union all
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,d2.hierarchy_level + 1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
join dep_cte d2
on d.object_id = d2.child_id
where d.referenced_minor_id in (0,1)
)
select *
from dep_cte
order by hierarchy_level
Ich habe dies zu öffnen, um die Gemeinschaft jetzt.Könnte jemand mit bequemem Zugriff auf eine laufende Oracle-Instanz hier eine rekursive CONNECT BY-Abfrage posten? Beachten Sie, dass dies SQL-Server-spezifisch ist und der Fragesteller seither klargestellt hat, dass er Oracle verwendet. Ich habe keine laufende Oracle-Instanz zur Hand, um etwas zu entwickeln und zu testen.
Ich wusste nichts darüber. Aber ich denke, es ist nicht sehr benutzerfreundlich. Ich werde es mir ansehen. –
CONNECT BY würde diesen Code unbedingt vereinfachen. –