2009-05-15 8 views
8

Ich habe vor etwa einer Woche eine Frage zu SOF über das Auditing von SQL-Datenänderungen gestellt. Das übliche Zeug über die Verwendung von Triggern kam auf, es gab auch die Erwähnung von CDC in SQL Server 2008.SQL Server 2008 Datenerfassung ändern, wer hat die Änderung vorgenommen?

Ich habe es heute ausprobiert und so weit so gut, die eine Sache, die ich nicht sehen kann, ist unterstützt Verfolgen Sie, wer die Änderung tatsächlich vorgenommen hat. Wer hat die Aussage ausgeführt?

Ich bin interessiert zu wissen, ob jemand CDC für Auditing verwendet hat und wie Sie verfolgt haben, wer die Änderung vorgenommen hat?

+1

Kann ich wissen, wie Sie dieses Problem gelöst haben? –

Antwort

1

wirklich CDC ist nicht für die Prüfung konzipiert. Wenn Sie nach Auditing-Funktionen suchen, sollten Sie SQL Server Audit verwenden.

+0

Das stimmt nicht genau. Während ich verstehe, dass CDC für Dinge wie Data Warehousing verwendet wird, habe ich eine Reihe von Artikeln gelesen, die ich gelesen habe vorschlagen, CDC kann für die Überprüfung von Datenänderungen als eine asynchrone Alternative zur Verwendung von Triggern verwendet werden. Obwohl vereinbart, war es nicht dafür ausgelegt. – MrEdmundo

+2

SQL Server Audit erfasst keine Vorher-Nachher-Werte. Es macht keinen Eindruck, dass MS die Schwierigkeiten bei der Implementierung von zwei Ansätzen (CDC & SSA) durchmachte und keiner von ihnen löst das Problem, Änderungen vollständig zu überwachen. – tbone

+0

@tbone Ich denke, es gibt tatsächlich drei Methoden. CDC, Audit und Änderungsverfolgung. Derzeit entwickelt ein gutes Vorher-Nachher-Audit-System mit CDC und einer Mischung aus einfachen Triggern, bei denen CONTEXT_INFO von der App mit dem Benutzer gefüllt wurde (da keine SQL Server-Benutzer verwendet werden) und anderen Statusinformationen. – GilesDMiddleton

0

Obwohl nicht ideal, scheint der allgemeine Konsens zu sein, dass CDC nicht erfassen wird, wer die Änderung vorgenommen hat, aber wir haben Spalten CreatedBy/Date und UpdatedBy/Date implementiert, die verwendet werden können, um zu sehen, wer die Änderung ausgelöst hat. Damit das funktioniert, muss natürlich die SP- oder SQL-Anweisung, die die Zeile aktualisiert, die Felder "UpdatedBy/Date" explizit mit "suser_name()" und "getDate()" festlegen. Ich stimme zu, dass es schön wäre, out of the box zu haben, und das macht CDC etwas, für das es nicht gedacht ist, aber ich versuche auch, CDC zu verwenden, um Datenänderungen asynchron zu prüfen, anstatt traditionelle Trigger zu verwenden.

+0

Wir verwenden derzeit CDC für Audit-Tracking, und dies ist der Ansatz, mit dem wir gingen. Wir fügten jeder Tabelle eine Audit-Benutzer-ID-Spalte hinzu und modifizierten unsere gespeicherten Prozeduren, um diese Spalte zu aktualisieren. Vielleicht nicht die schönste Lösung, aber es funktioniert. – MrDustpan

1

MrEdmundo, CDC ist meiner Meinung nach nicht zur Primetime bereit. Es scheint derzeit ziemlich schwierig zu sein, ein Datenbankprojekt aus Visual Studio mit aktivierter CDC zu implementieren (DDL-Änderungen sind nicht möglich). Darüber hinaus scheint es, dass CDC eine integrierte Daten Ende-of-Life Cleanup-Prozess hat, so dass dies für Sie schlechte Zeiten sein kann, wenn Sie wirklich Ihre Audit-Geschichte für eine lange Zeit pflegen möchten.

Auch korrigiert mich wenn ich falsch verstanden habe, aber es scheint, SQL Audit richtet sich eine Fülle von Ereignissen Prüfung, die in SQL Server wie fehlgeschlagen Log-Ins auftreten, DDL-Änderungen usw.

Änderungsverfolgung ist nur für DDL und nicht für DML, also hast du kein Glück.

Wenn Sie wirklich beabsichtigen, den "alten" Datensatz zu erfassen, der entweder aktualisiert oder aus einer Tabelle gelöscht wurde, scheint die beste Antwort immer noch die Erstellung eines Audit.TableName und eines update + delete-Triggers auf dbo.TableName. Stellen Sie außerdem sicher, dass TableName die Spalten CreatedBy DEFAULT SUSER, CreatedDate DEFAULT getdate(), ModifiedBy, ModifiedDate enthält.

6

geändert ich die CDC-Tabelle direkt mit: ALTER TABLE cdc.dbo_MyTable_CT hinzufügen Nickname nvarchar (50) NULL DEFAULT (SUSER_SNAME())

BTW beurteilen Sie die aktuellen Informationen nicht benötigen, da es bereits ist in die Start- und End-LSN-Felder.

Mein einziges Problem ist, dass sich meine Benutzer über eine Windows-Gruppe anmelden, die ihnen erlaubt, Rechte zu ändern, aber das UserName-Feld ist immer mein Benutzername und nicht ihr. Ich habe keine Lösung für dieses Problem gefunden.

+0

Die Zeit ist in der Tabelle cdc.lsn_time_mapping – Satfactor

+0

das scheint nicht zu funktionieren - ich bekomme "sa" in der Spalte, wenn ich ein UPDATE von einem anderen Login ausführen –

0

Hier ist Auslöser, die durch einige automatisierten Prozess erstellt werden kann oder manuell, wenn CDC auf, dass bestimmte Tabelle aktiviert ist, wird dieser Trigger das Problem lösen, dass die & von wo Änderungen vorgenommen wurden:

CREATE TRIGGER TR_TABLENAME_CDC 
ON TABLENAME 
FOR INSERT, UPDATE, DELETE 
AS 
DECLARE   
     @SessionID int, 
     @AppName nvarchar(255), 
     @HostName nvarchar(255), 
     @UserName nvarchar(32) 
BEGIN 
    SELECT @[email protected]@SPID 
    SELECT @AppName=program_name, @HostName=host_name from sys.dm_exec_sessions where session_id = @SessionID 

    IF(@AppName = 'BLAH BLAH' OR @AppName = 'XYZ' OR @AppName = 'ABC') 
    BEGIN 
     SELECT @UserName=login_name from sys.dm_exec_sessions where session_id = @SessionID 
     INSERT INTO UserDetail (SessionID, AppName, HostName, UserName) VALUES (@SessionID, @AppName, @HostName, @UserName) 
    END 
END 
5

Change Data Capture verfolgt nicht den Benutzer, den Computer, der die Änderung vorgenommen hat, oder den Zeitpunkt der Änderung.

Die beste Lösung zum Nachverfolgen von Benutzern, die die Änderung mit CDC vorgenommen haben, besteht darin, ein neues Feld zum Speichern von Benutzerdetails zu erstellen, das bei jeder Änderung aktualisiert wird (gefundene Idee here).

Ein anderer Artikel in derselben Serie führte mich zu einem Drittanbieter-Tool, das eine Out-of-the-Box-Lösung bietet. Ich bin noch dabei, den Prozess zu bewerten, aber bisher sieht es ziemlich gut aus. Sie können den Vergleich der verfolgten Informationen in einer praktischen Tabelle am Ende von this sequel sehen.

Hoffe, das hilft.

+0

können Sie erweitern "Erstellen Sie ein neues Feld zum Speichern von Benutzern Details, die bei jeder Änderung aktualisiert werden ". Ist das wie die obige Antwort? Woher kommen die Benutzerdaten? –