私たちの環境では、sa でログインするすべてのユーザーがテーブル データを変更できます。
誰が変更したか、どのIPから変更したかなど、変更されたデータをキャプチャするトリガーを作成します
CREATE TRIGGER [TRG_Users]
ON [dbo].[UserRights] AFTER INSERT, UPDATE, DELETE
AS
DECLARE @strIP VARCHAR(MAX)
SET @strIP=(SELECT dbo.GetCurrentIP())
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
--PRINT 'Update happened';
INSERT INTO Logger(IPAddress,Status)
VALUES (@strIP,'UPDATE')
ELSE
IF EXISTS (SELECT * FROM INSERTED)
--PRINT 'Insert happened';
INSERT INTO Logger(IPAddress,Status)
VALUES (@strIP,'INSERT')
ELSE
--PRINT 'Delete happened';
INSERT INTO Logger(IPAddress,Status)
VALUES (@strIP,'DELETE')
CREATE FUNCTION [dbo].[GetCurrentIP] ()
RETURNS varchar(255)
AS
BEGIN
DECLARE @IP_Address varchar(255);
SELECT @IP_Address = client_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID;
Return @IP_Address;
END
ただし、問題は、特定のテーブルでトリガーを無効にした後にユーザーがデータを変更できることです。そのため、トリガーは起動せず、ユーザーはシームレスにデータを変更できます。
データの変更をキャプチャしてログに記録する最良の方法を教えてください。そのため、誰もセキュリティをバイパスできません。変更データをキャプチャする別の方法を探しているので、sa アカウントを無効にしないでください。はいの場合は、SQL Server 2005/2008 に安全な方法が存在しますか? ありがとう