您可以考慮使用觸發器和日誌表,這將適用於所有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