您可以考虑使用触发器和日志表,这将适用于所有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
这是它是如何工作的:
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
在SQL Server中的内置机制,从2008版开始,更改数据捕获(CDC),它不只是。它也会告诉你什么改变了。 – 2014-12-03 00:06:21
从迄今为止我读过的所有内容来看,CDC没有捕捉到做出更改的用户名。我也不需要保留所有的变化。这可能会导致数据库增长得比我想要的大得多。 – 2014-12-03 16:29:47
你如何处理你的C#应用程序中的数据库访问? Single userId或Windows身份验证(意味着每个用户都有一个数据库帐户)? – UnhandledExcepSean 2014-12-03 21:10:32