2012-04-17 5 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; 

을 이제 수 귀하의 규칙을 따르는 대신에 트리거가 있어야합니다. 커프스로부터의 거친 아이디어 :

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