Stored Procedures Reverse Engineering
-
09-06-2019 - |
Frage
Wir haben Problem mit einer großen Anzahl von Legacy gespeicherten Prozeduren bei der Arbeit. Haben Sie Jungs jedes Werkzeug empfehlen, desto besser, diese Verfahren zu verstehen helfen kann? Irgendeine Art von Reverse-Engineering, die inter-Verfahren Abhängigkeiten und / oder Verfahren gegen Tabellen Abhängigkeiten indentifies. Kann ein freies oder kommerzielles Werkzeug sein.
Danke!
Lösung
Redgate hat ein ziemlich teures Produkt namens SQL Dependency Tracker , die zu erfüllen scheinen die Anforderungen.
Andere Tipps
Die billigere Lösung als ‚Dependency Tracker‘ ist die Data-Dictionary-Tabelle sys.sql_dependencies, die sich von denen diese Daten aus dem Data Dictionary abgefragt werden. Oracle hat ein Data Dictionary-View mit ähnlicher Funktionalität namens DBA_DEPENDENCIES (plus Äquivalent USER_ und ALL_ Aufrufe). Mit den anderen Data Dictionary-Tabellen (sys.tables / DBA_TABLES) usw. Sie Beziehungs Berichte erzeugen kann.
Wenn Sie etwas besonders daran interessiert, Sie eine rekursive Abfrage (Oracle CONNECT BY oder SQL Server Common Table Expressions) können Sie eine komplette Objektabhängigkeitsgraphen bauen.
Hier ist ein Beispiel eines rekursiven CTE auf sys.sql_dependencies. Es wird für jede Abhängigkeit mit seiner Tiefe einen Eintrag zurück. Elemente können mehr als einmal auftreten, möglicherweise in unterschiedlichen Tiefen, für jede Abhängigkeitsbeziehung. Ich habe keine Arbeit Oracle-Instanz zur Hand habe ein CONNECT BY-Abfrage auf DBA_DEPENDENCIES zu bauen, so dass jedermann mit Bearbeitungsrechten und die Zeit und Know-how willkommen zu annotieren oder diese Antwort zu bearbeiten.
Beachten Sie auch mit sys.sql_dependencies
, die Sie Spaltenreferenzen von referenced_minor_id
erhalten. Dies könnte verwendet werden (zum Beispiel), um zu bestimmen, welche Spalten wurden verwendet, tatsächlich in der ETL sprocs von einem Staging-Bereich mit Kopien der DB-Tabellen von der Quelle mit mehr Spalten als tatsächlich verwendet werden.
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 diese nun an die Gemeinde zu öffnen-up bekam. Könnte jemand mit bequemem Zugang zu einem laufenden Oracle-Instanz eine CONNECT BY rekursive Abfrage hier posten? Beachten Sie, dass diese SQL-Server bestimmte und die Frage Eigentümer, da er deutlich gemacht hat, ist, dass er von Oracle verwenden. Ich habe keine laufende Oracle-Instanz zur Hand habe, um etwas zu entwickeln und zu testen.
Ich denke, die Red Gate Dependency Tracker von rpetrich erwähnt ist eine annehmbare Lösung, es funktioniert gut und Red Gate hat 30 Tage-Testversion (idealerweise lang genug, damit Sie Ihre Forensik tun tun).
Ich würde auch das System zu isolieren und die SQL Profiler ausgeführt wird, die Sie alle SQL-Aktion auf den Tabellen zeigen . Dies ist oft ein guter Ausgangspunkt für den Aufbau einer Sequenzdiagramm oder aber Sie wählen, diese Codes zu dokumentieren . Viel Glück!
Redgate SQL Doc. die erzeugte Dokumentation mit Querverweisen Abhängigkeitsinformationen. Zum Beispiel, für jede Tabelle listet es Views, Stored Procedures, Trigger usw., die diese Tabelle verweisen.
Welche Datenbank der gespeicherten Prozeduren in werden? Oracle, SQL Server, etwas anderes?
Bearbeiten basierend auf Kommentar: Da Sie Oracle verwenden, dann haben Sie einen Blick auf TOAD . Ich benutze eine Funktion in den Kodex Roadmap genannt, die Sie grafisch ermöglicht PL / SQL interdependancies innerhalb der Datenbank anzuzeigen. Es kann im Code Only-Modus läuft, Laufzeit Call-Stack Abhängigkeiten zeigt, oder Code Plus-Datenmodus, in dem es auch zeigt Sie Datenbankobjekte (Tabellen, Views, Trigger), die von Ihrem Code berührt werden.
(Hinweis - Ich bin ein TOAD Benutzer und gewinnen keinen Nutzen daraus bezieht)
Das ist nicht wirklich tief oder gründlich, aber ich denke, dass, wenn Sie MS SQL Server oder Oracle verwenden (vielleicht Nigel mit einer PL-SQL Probe helfen kann) ... Nigel ist auf etwas. Dies geht nur 3 Abhängigkeiten tief, aber modifiziert werden könnte, aber tief zu gehen, die Sie benötigen. Es ist nicht die schönste Sache ... aber es ist funktional ...
select
so.name + case when so.xtype='P' then ' (Stored Proc)' when so.xtype='U' then ' (Table)' when so.xtype='V' then ' (View)' else ' (Unknown)' end as EntityName,
so2.name + case when so2.xtype='P' then ' (Stored Proc)' when so2.xtype='U' then ' (Table)' when so2.xtype='V' then ' (View)' else ' (Unknown)' end as FirstDependancy,
so3.name + case when so3.xtype='P' then ' (Stored Proc)' when so3.xtype='U' then ' (Table)' when so3.xtype='V' then ' (View)' else ' (Unknown)' end as SecondDependancy,
so4.name + case when so4.xtype='P' then ' (Stored Proc)' when so4.xtype='U' then ' (Table)' when so4.xtype='V' then ' (View)' else ' (Unknown)' end as ThirdDependancy
from
sysdepends sd
inner join sysobjects as so on sd.id=so.id
left join sysobjects as so2 on sd.depid=so2.id
left join sysdepends as sd2 on so2.id=sd2.id and so2.xtype not in ('S','PK','D')
left join sysobjects as so3 on sd2.depid=so3.id and so3.xtype not in ('S','PK','D')
left join sysdepends as sd3 on so3.id=sd3.id and so3.xtype not in ('S','PK','D')
left join sysobjects as so4 on sd3.depid=so4.id and so4.xtype not in ('S','PK','D')
where so.xtype = 'P' and left(so.name,2)<>'dt'
group by so.name, so2.name, so3.name, so4.name, so.xtype, so2.xtype, so3.xtype, so4.xtype
Wie die Abhängigkeitskette eines Datenbankobjekt (MS SQL Server 2000 (?) +) finden von Jacob Sebastian
Jedes Mal, wenn er einen neuen Bericht bereitstellen muss oder ändern Sie eine vorhandene Bericht, muss er wissen, was die Datenbankobjekte sind, die davon abhängen, der gegebene Bericht gespeicherten Prozedur. Einige Male die Berichte sind sehr Komplex und jede gespeicherte Prozedur könnte Dutzende von abhängigen haben Objekte und jedes abhängige Objekt auf anderen dutzende Abhängigkeit kann aus Objekte.
Er brauchte einen Weg, um rekursiv alle Objekte in Abhängigkeit von a zu finden gespeicherte Prozedur gegeben. Ich schrieb eine rekursive Abfrage mit CTE zu erreichen dies.
Das einzige beste Werkzeug für das Reverse Engineering ist von APEX. Es ist wunderbar. Es kann sogar in .NET-Assemblies verfolgen und Ihnen sagen, wo die Procs verwendet werden. Sein mit Abstand die tiefste Produkt seiner Art. RedGate hat große andere Werkzeuge, aber nicht in diesem Fall.