2012-04-17 6 views
0

私のデータベースには、変更を追跡するいくつかの列があります。 A列、B列、C列があります。ユーザーと管理者はこれらの列の値を変更できます。セル値(列、行)が管理者によって変更された場合、ユーザーはそれを変更できません。トラックデータベースフィールドの変更 - SQLサーバー

これを解決するには、行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 
関連する問題