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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top