【发布时间】:2014-05-25 19:44:59
【问题描述】:
在我们的环境中,任何使用 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登录,您将无法控制他们的活动,如果他们不想被监控,甚至无法监控他们的活动,并且将SA角色分配给许多用户绝不是一个好主意反正。为您的用户/开发人员分配一个足以满足他们需求的适当角色,然后创建此触发器并取消他们在此触发器上禁用的权限。 -
您似乎很清楚让其他人以
sa连接的问题。我不确定您希望任何人如何解决您的问题。充其量,你会玩猫鼠游戏,总是试图领先一步。最好的解决方案是你显然不想听到的——不要让其他人以sa连接(或任何其他具有sysadmin权限的登录)。