用户名的数据库审计触发器

时间:2017-04-28 14:51:52

标签: sql-server triggers

我在数据库审计触发器中使用了一段代码,但是根据在给定时间使用数据库的人数,代码可能会返回意外值。

-- set username
IF EXISTS (SELECT * FROM inserted)
   IF EXISTS (SELECT * FROM deleted)
           SET @UserName = (SELECT Top 1 UserName FROM inserted)
   ELSE
           SET @UserName = (SELECT Top 1 UserName FROM inserted)
ELSE
   SET @UserName = (SELECT Top 1 UserName FROM deleted)

在某些情况下,这是正确的,并且正在记录预期的用户名。但似乎另一个用户也比第一个用户更新了一小部分,然后他们的用户名被记录下来。

System_User,User_Name和Current_User都返回用于访问数据库的网站使用的iis系统。有没有办法修改此代码,以便捕获实际的用户名?正在更新的表将始终具有UserName列,但不确定如何在触发器中捕获它。

1 个答案:

答案 0 :(得分:0)

您的问题在于用于在关联表中设置UserName列的任何逻辑。如果这个逻辑是正确的(我们只能假设您没有验证该部分),那么您的代码应该可以正常工作。

你确实有一个触发写作常见的缺陷。您的逻辑假设至少有一行受到触发DML语句的影响。零行完全可能受到影响 - 在这种情况下触发器仍将执行。确保你的逻辑正确地解释了这种情况。