0
在我的數據庫中,我有幾列需要跟蹤其更改。讓我們有A,B和C列。用戶和管理員可以更改這些列中的值。如果管理員更改單元格值(列,行),則用戶不應該更改它。跟蹤數據庫字段更改 - sql server
爲了解決這個問題,我正在考慮維護一個日誌表,用於更改字段的單元格 - 行ID,列ID,用戶更改。
注意:我正在使用Sql Server 2008,C#。
請評論我的想法。謝謝。
在我的數據庫中,我有幾列需要跟蹤其更改。讓我們有A,B和C列。用戶和管理員可以更改這些列中的值。如果管理員更改單元格值(列,行),則用戶不應該更改它。跟蹤數據庫字段更改 - sql server
爲了解決這個問題,我正在考慮維護一個日誌表,用於更改字段的單元格 - 行ID,列ID,用戶更改。
注意:我正在使用Sql Server 2008,C#。
請評論我的想法。謝謝。
SQL Server不保留最後誰更改列的信息。因此,您需要使用INSTEAD OF或AFTER觸發器來跟蹤這些信息。如果用戶嘗試更新列A和列B,但管理員僅更新了列A - 是否允許用戶更新列B,或者如果他們的整個更新失敗,您還需要決定要執行的操作?
你可以在指示ChangedByAdmin每列的表的附加列:(使用一個單獨的表,除非你想保持歷史似乎矯枉過正)
ALTER TABLE dbo.MyTable ADD A_ChangedByAdmin BIT NOT NULL DEFAULT 0;
ALTER TABLE dbo.MyTable ADD B_ChangedByAdmin BIT NOT NULL DEFAULT 0;
ALTER TABLE dbo.MyTable ADD C_ChangedByAdmin BIT NOT NULL DEFAULT 0;
現在你可以有一個INSTEAD OF觸發器遵循你的規則。只是一個粗略的想法:袖釦:
CREATE TRIGGER dbo.Update_MyTable
FOR dbo.MyTable
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @a BIT = CASE USER_NAME() WHEN 'Administrator' THEN 1 ELSE 0 END;
IF UPDATE(A)
BEGIN
UPDATE t
SET A = i.A, A_ChangedByAdmin = @a
FROM dbo.MyTable AS t
INNER JOIN inserted AS i
ON t.key = i.key
INNER JOIN deleted AS d
ON i.key = d.key
AND i.A <> d.A -- why bother if the value is the same
WHERE (@a = 1 OR d.A_ChangedByAdmin = 0);
END
-- repeat for B and C
-- then update the unrestricted columns:
UPDATE t SET D = i.D, E = i.E --, etc.
FROM dbo.MyTable AS t
INNER JOIN inserted AS i
ON t.key = i.key;
END
GO