Wie finde ich heraus, welches Paket/Verfahren zu aktualisieren ist eine Tabelle?
Ich würde gerne herausfinden, ob es möglich ist, um herauszufinden, welches Paket oder Verfahren in einem Paket-Aktualisierung einer Tabelle?
Durch ein bestimmtes Projekt zu übergeben (die person, die übergeben das Projekt hat seit Links), ohne ordnungsgemäße Dokumentation, Daten, wissen wir, dass wir aktualisiert haben, gehen immer wieder einige seltsame Quelle.
Sind wir erraten, dass dies ein Datenbank-job oder einen Planer mit der update-Befehl ohne unser wissen. Ich bin der Hoffnung, dass es einen Weg gibt, um herauszufinden, wo der source-code ist der Aufruf aus, der die Aktualisierung der Tabelle und einfügen der Quelle als einen trigger auf die Tabelle, die wir beobachten.
Irgendwelche Ideen?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Kombination mit dem, was Tony erwähnt, können Sie eine logging-Tabelle und einen trigger, der wie folgt aussieht:
Damit der trigger oben zu kompilieren, müssen Sie gewähren die Eigentümer der Auslöser dieser Berechtigungen, wenn Sie angemeldet sind in der SYS-Benutzer:
Werden Sie wahrscheinlich wollen, schützen Sie die insert-Anweisung in der dem trigger mit einer Bedingung, dass macht es nur melden, wenn die änderung, die Sie interessiert, ist, Auftritt - auf meinem test-server diese Anweisung wird ziemlich langsam (1 Sekunde), so dass ich würde nicht wollen, zu protokollieren, alle diese updates. Natürlich, in diesem Fall würden Sie müssen ändern Sie den trigger auf Zeilenebene ein, so dass Sie könnte zu untersuchen :neue oder :die alten Werte. Wenn Sie wirklich besorgt über den Aufwand der wählen, können Sie es ändern, um nicht sich gegen die v$sql, und stattdessen einfach nur speichern Sie das SQL_ADDRESS Spalte, dann planen Sie ein job mit DBMS_JOB zu gehen und aktualisieren Sie die Spalte sql_text mit einem zweiten update-Anweisung, Verschiebung und somit das update in einer anderen Sitzung, und nicht blockiert, Ihre ursprüngliche update.
Leider wird dies nur sagen Hälfte die Geschichte. Die Aussage, die Sie gehen, um zu sehen, angemeldet ist die proximale Anweisung - in diesem Fall ein update - selbst wenn das ursprüngliche Anweisung ausgeführt, die durch den Prozess ausgelöst hat, ist es eine gespeicherte Prozedur. Dies ist, wo die program_id Spalte kommt. Wenn die update-Anweisung Teil einer Prozedur oder einem trigger, program_id auf die object_id des Kodex in Frage - können Sie Sie lösen es folgendermaßen:
In dem Fall, wenn die update-Anweisung ausgeführt wurde, direkt aus dem client, ich weiß nicht, was program_id darstellt, aber Sie würden nicht müssen, Sie hätten den Namen der ausführbaren Datei in der "Programm" - Spalte statement_tracker. Wenn das update ausgeführt wurde, aus einem anonymen PL/SQL block, ich bin nicht, wie es zu verfolgen zurück - müssen Sie Experimentieren.
Kann es jedoch sein, daß die osuser/- Maschine/Programm - /Modul-Informationen werden möglicherweise genug, um Sie schon in die richtige Richtung.
Wenn es eine geplante Datenbank job dann finden Sie heraus, was die geplante Datenbank Arbeitsplätze vorhanden sind und Blick in das, was Sie tun. Andere Dinge, die Sie tun können, sind:
Suche alle Datenbank-Quellcode für die Verweise auf die Tabelle wie diese:
select distinct Typ, name
von all_source
where lower(text) like lower('%Personen%');
Wieder, dass möglicherweise zurück, eine Menge von Objekten, und natürlich wird es einige "false positives", wo der Suchbegriff angezeigt wird, aber ist das nicht eigentlich ein Verweis auf die Tabelle. Sie könnten sogar versuchen etwas genauer zu sein wie:
aber natürlich vermissen würde, Fälle, in denen der Befehl wurde anders formatiert.
Darüber hinaus könnte es sein, SQL-Skripte ausgeführt werden über "cron" - jobs auf dem server?
Schreiben Sie einfach eine "nach Aktualisierung" auszulösen, und in diesem auslösen, protokollieren die Ergebnisse der "DBMS_UTILITY.FORMAT_CALL_STACK" in eine eigene Tabelle.
Der Zweck dieser Funktion ist genau zu Ihnen der komplette call-stack von al der gespeicherten Prozeduren und Trigger, die entlassen wurden, erreichen Sie Ihren code.
Ich Schreibe aus dem Handy-app, so kann ich nicht geben Sie weitere detaillierte Beispiele, aber wenn Sie google für Sie, finden Sie viele von Ihnen.
Einen quick-and-dirty-option, wenn Sie lokal arbeiten, und sind nur daran interessiert, die erste Sache, die die Daten verändert werden, ist zu werfen, ist ein Fehler in der trigger anstelle der Protokollierung. So erhalten Sie die übliche stack-trace, und es ist viel weniger eingeben und brauchen Sie nicht eine neue Tabelle zu erstellen: