Spo*_*ght 6 c# sql-server audit
我正在将一个应用程序从Access转换为SQL Server 2014.此工具的一个功能是允许用户创建临时SQL查询以修改删除或向多个表添加数据.
现在在Access中没有跟踪谁做了什么,所以如果事情搞砸了,没有办法知道它是谁或什么时候发生(它已经发生了很多次,这是一个严重的问题,而且很多工具被重写的原因).
我正在编写的应用程序是C#中的Windows应用程序.我正在寻找任何关于如何在不对服务器(处理或空间)提出巨大需求的情况下完成的建议.由于用户正在创建自己的查询,因此我不能只添加用户名和日期列(也只能跟踪最近的更改).
我们不需要保留旧数据,甚至无需确定更改的内容.谁改变了数据以及何时改变了数据.我希望能够查看某些内容(视图,表格或甚至是单独的数据库),这些内容向我显示了进行更改的用户列表以及何时进行更改.
您可以考虑使用触发器和日志表,这适用于所有 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)
