2014-12-02 6 views
6

Ich konvertiere eine Anwendung von Access zu SQL Server 2014. Eine der Funktionen dieses Tools ist es, Benutzern zu ermöglichen, Ad-hoc-SQL-Abfragen zum Ändern von Lösch zu erstellen oder fügen Sie Daten zu einer Anzahl von Tabellen hinzu.Verfolgen, wer Änderungen an SQL Server in C# -Anwendung oder SQL Server macht

Gerade jetzt in Access gibt es keine Nachverfolgung, wer was macht, wenn etwas bei einem Unfall versagt, gibt es keine Möglichkeit zu wissen, wer es war oder wann es passiert ist (es ist schon oft passiert, dass es ein ernstes Problem ist und einer der vielen Gründe, warum das Tool neu geschrieben wird).

Die Anwendung, die ich schreibe, ist eine Windows-Anwendung in C#. Ich suche nach ALLEN und allen Vorschlägen, wie dies getan werden kann, ohne eine große Nachfrage auf den Server (Verarbeitung oder Speicherplatz) zu stellen. Da die Benutzer ihre eigenen Abfragen erstellen, kann ich nicht einfach eine Spalte für Benutzername und Datum hinzufügen (die auch nur die letzte Änderung verfolgen würde).

Wir müssen die alten Daten nicht behalten oder sogar genau identifizieren, was geändert wurde. Nur wer Daten geändert hat und wann sie es getan haben. Ich möchte in der Lage sein, etwas anzusehen (Ansicht, Tabelle oder sogar separate Datenbank), die mir eine Liste der Benutzer zeigt, die eine Änderung vorgenommen haben und wann sie es getan haben.

+1

lesen kann, Es gibt einen eingebauten Mechanismus in SQL Server ab Version 2008 starten, Change Data Capture (CDC), das tut nur das. Und es zeigt Ihnen auch, was genau geändert wurde. –

+0

Von allem, was ich bisher gelesen habe, erfasst CDC nicht den Benutzernamen, der die Änderung vorgenommen hat. Auch muss ich nicht alle Änderungen behalten. das könnte dazu führen, dass die DB viel größer wird als ich will. –

+0

Wie gehen Sie mit dem Zugriff auf die Datenbank in Ihrer C# -App um? Einzelbenutzer- oder Windows-Authentifizierung (dh jeder Benutzer hat ein Datenbankkonto)? – UnhandledExcepSean

Antwort

0

Sie können Trigger und eine Protokolltabelle verwenden, dies funktioniert auf allen SQL Servern. Trigger sind ein wenig teurer als CDC, aber wenn Ihre Benutzer bereits direkt auf Ihren Tabellen aktualisieren, sollte dies kein Problem sein. Ich denke, das hängt auch davon ab, wie viele Tabellen Sie protokollieren möchten.

Ich werde Sie mit einem einfachen Beispiel bietet für die Benutzer anmelden, die eine Tabelle oder mehrere Tabellen geändert hat (fügen Sie einfach den Auslöser zu den Tabellen):

CREATE TABLE UserTableChangeLog 
(
    ChangeID INT PRIMARY KEY IDENTITY(1,1) 
    , TableName VARCHAR(128) NOT NULL 
    , SystemUser VARCHAR(256) NOT NULL DEFAULT SYSTEM_USER 
    , ChangeDate DATETIME NOT NULL DEFAULT GETDATE() 
) 

GO 

CREATE TABLE TestTable 
(
    ID INT IDENTITY(1,1) 
    , Test VARCHAR(255) 
) 

GO 
--This sql can be added for multiple tables, just change the trigger name, and the table name 
CREATE TRIGGER TRG_TABLENAME_Log ON TestTable 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    --Can be used to get type of change, and wich data that was altered. 
    --SELECT * FROM INSERTED; 
    --SELECT * FROM DELETED; 

    DECLARE @tableName VARCHAR(255) = (SELECT OBJECT_NAME(parent_id) FROM sys.triggers WHERE object_id = @@PROCID); 

    INSERT INTO UserTableChangeLog (TableName) VALUES (@tableName); 

END 

GO 

Dies ist, wie es funktioniert:

INSERT INTO TestTable VALUES ('1001'); 
INSERT INTO TestTable VALUES ('2002'); 
INSERT INTO TestTable VALUES ('3003'); 
GO 

UPDATE dbo.TestTable SET Test = '4004' WHERE ID = 2 

GO 

SELECT * FROM UserTableChangeLog 

enter image description here

+0

Dies ist vielleicht, was ich am Ende tun muss, aber ich habe gehört, dass Trigger die Leistung wirklich beeinflussen können. –

+0

@Spots Knight: Es hängt vom Trigger ab, wenn Sie einige "teure" Abfragen in Ihrem Trigger ausführen, wird dies Ihre Leistung beim Starten erheblich beeinträchtigen, da Sie darauf warten müssen, dass sie abgeschlossen wird. In Szenarien, in denen Sie möglicherweise Hunderte oder Tausende verschiedener UPDATE/INSERT/DELETE-Abfragen in kurzen Intervallen haben, würde ich auch überdenken, keine Trigger zu verwenden. In diesem Beispiel wird jedoch nicht mehr Leistung benötigt als eine zusätzliche "EIN-Zeilen-EINFÜGE", die schwer zu messen wäre. –

0

Sie haben nicht die SQL Server-Version angegeben ist, trotzdem, wenn Sie eine Version haben> = 2008 R2 Sie Extended Events verwenden Überwachen Sie Ihr System.

Extended Events Config

Extended Events Log

auf Stackoverflow Sie my answer zu ähnlichen Problem

+0

Ich habe gesagt, dass ich nach SQL Server 2014 ging. Sind diese erweiterten Ereignisse in dieser Version noch verfügbar oder wurden sie entfernt? –

+0

Entschuldigung ... Ja ist in ALLEN Versionen (inklusive Express Edition) verfügbar – Max