在我们的环境中使用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中存在任何安全的方式,请在此讨论。谢谢

有帮助吗?

解决方案

SA的问题是所有安全检查都会跳过此登录(或者在Sysadmin角色中的任何其他登录所述问题)。所以,你不能从sa撤消任何权限,也没有任何东西可以在sa无法绕过的实例级别。

就像其他人已经说过,除非有真正的sysadmin工作要做,否则不要让任何人登录。最佳实践是完全禁用SA登录。

在Cnuckerive侧,您最好的打赌否则是创建SQL Server审核会话并使用Windows安全日志作为目标。这样你的方式至少知道谁和在停止审计时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top