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