跟踪谁在C#应用程序或SQL Server中更改SQL Server

Spo*_*ght 6 c# sql-server audit

我正在将一个应用程序从Access转换为SQL Server 2014.此工具的一个功能是允许用户创建临时SQL查询以修改删除或向多个表添加数据.

现在在Access中没有跟踪谁做了什么,所以如果事情搞砸了,没有办法知道它是谁或什么时候发生(它已经发生了很多次,这是一个严重的问题,而且很多工具被重写的原因).

我正在编写的应用程序是C#中的Windows应用程序.我正在寻找任何关于如何在不对服务器(处理或空间)提出巨大需求的情况下完成的建议.由于用户正在创建自己的查询,因此我不能只添加用户名和日期列(也只能跟踪最近的更改).

我们不需要保留旧数据,甚至无需确定更改的内容.谁改变了数据以及何时改变了数据.我希望能够查看某些内容(视图,表格或甚至是单独的数据库),这些内容向我显示了进行更改的用户列表以及何时进行更改.

Jar*_*eth 0

您可以考虑使用触发器和日志表,这适用于所有 SQL Server。触发器比 CDC 贵一点,但是如果您的用户已经直接在您的表上进行更新,那么这应该不是问题。我认为这也取决于您想要记录多少张表。

我将为您提供一个简单的示例,用于记录更改一个表或多个表的用户(只需将触发器添加到表中):

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
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述