Melden Sie änderungen der Datenbank-Tabelle mit trigger
Ich bin auf der Suche nach einem guten Weg, Protokollierung von änderungen, die auftreten, auf einen bestimmten Satz von Tabellen in meiner SQL-Server-2005-Datenbank. Ich glaube, der beste Weg, dies zu tun ist durch einen trigger, das ausgeführt wird, aktualisiert und löscht. Gibt es trotzdem zu greifen, die eigentliche Aussage, die gerade lief? Einmal habe ich die Aussage kann ich einfach anmelden es woanders (andere DB-Tabelle). Allerdings habe ich nicht einen einfachen Weg gefunden (wenn möglich) zu greifen, die SQL-Anweisung, die gerade lief.
- Es wäre so einfach zu tun, dies von der Anwendung, wodurch die Datenbank aufrufen. Man müsste den SQL-text und/oder die sproc Namen + die Namen der parameter und Werte. Aber man müsste die app-Entwickler, und nicht der DBA, haben keine Kontrolle über diese.
- Und auch Sie würde nicht alles loggen, was, die durchgeführt alle updates/deletes, die über andere verbindungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auslöser sind schlecht, ich würde bleiben Sie Weg von Trigger.
Wenn Sie versuchen, zu beheben etwas, befestigen Sql Profiler, um die Datenbank mit bestimmten Bedingungen. Diese protokolliert jede Abfrage ausführen, die für Ihre Inspektion.
Andere Möglichkeit ist der Wechsel an das aufrufende Programm zu melden seine Abfragen. Dies ist eine sehr gängige Praxis.
Wenn Sie nur wollen, zu halten Protokoll aller Transaktionen (insert, update und delete) in einigen Tabellen der Datenbank, dann können Sie das folgende Skript ausführen:
Sollten Sie in der Lage sein, dies zu erreichen, mit der system-management-sichten.
Ein Beispiel wäre so etwas wie dieses:
Ich bin nicht sicher, ob dies wird sich als nützlich für Sie mehr als eine Daten-centric logging Mechanismus könnte sein, though.
Vergessen Sie nicht, dass Ihre Anmeldung wird ein Teil der Transaktion, also wenn ein Fehler vorliegt, und Sie ein rollback für die Transaktion, dein log auch gelöscht werden.
MSSQL virtuelle Tabellen namens 'Inserted' und 'Gelöscht', welche die neu eingefügten und/oder neu-gelöscht und/oder neu-aktualisierte Datensätze, die Sie zugreifen können, von einem trigger ... diese benutze ich, um zu wissen welche Daten geändert hat (das ist stattdessen wird gesagt, welche Aussage die Daten geändert).
Gibt es ein Muster für die Erstellung wie diese Auslöser genannt Log Trigger. Das ist Hersteller unabhängig und sehr einfach. Es ist beschrieben in hier.
Der Veränderungen, die aufgezeichnet werden auf einem anderen Geschichte Tabelle. Es gibt keine Möglichkeit zu greifen, die genaue Aussage, aber es ist möglich zu erkennen, ob es war ein einfügen und aktualisieren oder löschen, denn es sorgt für ein "Ketten" - Satz von Datensätzen. Eine insertion ist eine Aufzeichnung ohne Vorgänger, ist eine Löschung eines Datensatzes ohne Nachfolger, intermediate Datensätze werden aktualisiert. Veränderungen können erkannt werden, vergleicht man einen Datensatz gegen seine Vorgänger.
Ist es sehr einfach, ein snapshot von einer einzigen Person (oder die gesamte Tabelle) an einem gegebenen Punkt in der Zeit.
Als bonus, die syntax dieses Muster für den SQL-Server erfolgt auf die einfachste, im Vergleich zu Oracle, DB2 und MySQL.
tun, die Sie wirklich brauchen, um sich die Aussage, dass die ran, die meisten Leute melden, die geänderten Daten (INSERTED-und DELETED-Tabellen nicht mit dem trigger).
Trigger sind eine gute Möglichkeit, um sicherzustellen, dass alle änderungen protokolliert werden, da Sie fast immer ausgelöst, unabhängig davon, wie die updates durchgeführt werden - z.B. ad-hoc-verbindungen als auch die Anwendung von verbindungen.
Vorgeschlagen von @mwigdahl, die system-management-Ansichten, die Aussehen wie ein guter Weg, um erfassen des aktuellen Batches. Ob das ist besonders nützlich, um log-in-der Auslöser ist eine andere Sache.
Einen Nachteil bei der Verwendung von Triggern ist, dass Sie nur identifizieren Sie die Quelle des update aus der Datenbank-Verbindung. Viele Anwendungen haben keine Benutzer Informationen, die im Zusammenhang mit der Verbindung zu erleichtern, connection pooling, so dass Sie nicht wissen, welcher Benutzer die Aktion ausführt. ie der Login verwendet, durch die Verbindung ist eine generische Anwendung, die login-eher als die person, die mit der Anwendung. Der normale Weg, dies zu umgehen, ist die Verwendung von gespeicherten Prozeduren als Schnittstelle, um alle Datenbank-Interaktion, und dann sicherzustellen, dass eine Benutzer-id übergeben wird, mit all procedure calls. Sie können dann Ihre Anmeldung über die gespeicherte Prozedur anstelle eines triggers. Natürlich ist dies nur sinnvoll, wenn Sie wissen, dass die Menschen nicht update-Tabellen direkt und ohne Verwendung von Verfahren oder nicht anmelden müssen, die situation.
Die Möglichkeit zu bekommen, die derzeit ausgeführten batch könnten, bieten einen noch besseren Mechanismus: wenn Sie sicherstellen, dass alle Ihre sql-batches enthalten eine Benutzer-id Sie können dann extrahieren Sie diese aus dem sql im trigger. Das würde Ihnen ermöglichen, zu tun, alle logging-Trigger, das heißt, Sie erfassen alles, aber auch lassen Sie verknüpfen die änderungen eines bestimmten Benutzers.
Wenn Sie gehen hinunter den Auslöser route-es lohnt sich, die Situationen, die Auslöser sind nicht gefeuert (vielleicht bulk-Daten geladen? oder wenn die Leute über die Berechtigung zum deaktivieren von Triggern).
Berücksichtigen Sie auch, wie @idstam wies darauf hin, dass die trigger-code in Ihre Transaktion so werden in der Regel protokolliert und rollten sich wieder zusammen mit ihm.
Andere Sache zu prüfen, wenn das schreiben löst das Verhalten der @@IDENTITY: wenn Sie über Verfahren verfügen, mit der @@IDENTITY, die Sie möglicherweise versehentlich Ihr Verhalten ändern.
Verwenden Log Trigger
Gibt es wenig Grund zu erfassen, die den tatsächlichen SQL-da kann es viele verschiedene Anweisungen, die Daten ändern, in der gleichen Weise.
Versuchen Sie, einige trigger-basierte third-party-tool wie ApexSQL Audit und dann reverse-engineering, wie Sie es tun. Installieren Sie es einfach im trial-Modus und sehen, wie es generiert den Trigger für die Erfassung aller anderen Arten von Informationen.
Einige andere Dinge zu beachten sind:
Storage-Planung – wenn Sie eine Menge von updates, das bedeutet, Sie haben eine Tonne von audit-Daten. Ich würde erwägen, das speichern, die Daten in separaten Datenbanken. Vor allem, wenn Sie planen, Rechnungsprüfung mehr als eine Datenbank.
Verwalten die Menge der Daten, die im Laufe der Zeit werden Sie wahrscheinlich nicht brauchen, zu halten, einige sehr alte Aufzeichnungen. Planen Sie auf einfache löschen von alten Daten
Schema-änderungen – was wäre wenn-schema aktualisiert. Im schlimmsten Fall löst, wird aufhören zu arbeiten und werfen einen Fehler, wenn nicht richtig erstellt. Im besten Fall werden Sie vermissen einige der Daten. Das ist auch etwas zu prüfen.
Nimmt man all dies berücksichtigt, ist es wahrscheinlich die meiste Zeit effektiv zu gehen mit einige bereits entwickelte Lösung vs erstellen, diese von Grund auf selbst.
Hier vorsichtig sein, da die Trigger auf Zeilenebene, nicht der SQL-STATEMENT-Ebene. Also, wenn jemand "LÖSCHEN VON BIGTABLE", Ihre trigger ausgelöst wird für jede Zeile in dieser Tabelle (dies speziell im Hinblick auf die Tatsache, dass Sie wollen zu wissen die SQL-Anweisung, die die operation durchgeführt, so dass Sie brauchen werden, um "herausfinden, dass" für jede Zeile, die Anweisung betrifft).