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