Suivi des modifications apscopes à SQL Server dans l'application C # ou SQL Server

Je convertis une application d'Access à SQL Server 2014. L'une des fonctionnalités de cet outil est de permettre aux users de créer des requêtes SQL ad hoc pour modifier la suppression ou append des données à un certain nombre de tables.

À l'heure actuelle, dans Access, il n'y a pas de suivi de qui fait quoi, si quelque chose se gâte par accident, il n'y a aucun moyen de savoir qui c'était ou quand c'est arrivé (il est arrivé assez de fois que c'est un problème grave raisons pour lesquelles l'outil est en cours de réécriture).

L'application que j'écris est une application Windows en C #. Je suis à la search de tout et toutes les suggestions sur les façons dont cela peut être fait sans mettre une énorme request sur le server (traitement ou espace). Comme les users créent leurs propres requêtes, je ne peux pas simplement append une colonne pour le nom et la date de l'user (qui ne ferait que suivre la modification la plus récente).

Nous n'avons pas besoin de conserver les anciennes données ou même d'identifier exactement ce qui a été changé. Juste qui a changé datatables et quand ils l'ont fait. Je veux être capable de regarder quelque chose (vue, table ou même database séparée) qui me montre une list d'users qui ont fait un changement et quand ils l'ont fait.

Vous n'avez pas spécifié la version de SQL Server, de toute façon si vous avez une version> = 2008 R2, vous pouvez utiliser des events étendus pour surveiller votre système.

Configuration des événements étendus

Journal des événements étendus

Sur stackoverflow vous pouvez lire ma réponse à un problème similaire

Vous pouvez envisager d'utiliser des triggersurs et une table de journal, cela fonctionnera sur tous les servers SQL. Les triggersurs sont un peu plus chers que CDC, mais si vos users mettent déjà à jour directement sur vos tables, cela ne devrait pas poser de problème. Je pense que cela dépendra aussi du nombre de tables que vous voulez save.

Je vais vous fournir un exemple simple pour consigner les users qui ont changé une table, ou plusieurs tables (il suffit d'append le triggersur aux tables):

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 sortinggger 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.sortingggers WHERE object_id = @@PROCID); INSERT INTO UserTableChangeLog (TableName) VALUES (@tableName); END GO 

Voici comment cela fonctionnera:

 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 

entrez la description de l'image ici