2012-04-17 74 views
0

在我的數據庫中,我有幾列需要跟蹤其更改。讓我們有A,B和C列。用戶和管理員可以更改這些列中的值。如果管理員更改單元格值(列,行),則用戶不應該更改它。跟蹤數據庫字段更改 - sql server

爲了解決這個問題,我正在考慮維護一個日誌表,用於更改字段的單元格 - 行ID,列ID,用戶更改。

注意:我正在使用Sql Server 2008,C#。

請評論我的想法。謝謝。

回答

1

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