SQL Server删除触发器不捕获用户名(SUSER_SNAME)

时间:2015-02-26 14:59:49

标签: sql sql-server user-interface triggers

我正在使用Web应用程序在SQL Server表中插入,更新和删除记录。当从GUI发生任何插入,更新,删除时,将在另一个表中捕获对此表的审计。

插入,更新正在正确捕获用户名,但是从GUi删除捕获SQL帐户而不是删除记录的Web用户名。

请提出解决方案。

删除的触发器代码如下:

-- DELETE
if exists (select 1 from deleted) and not exists (select 1 from inserted)
BEGIN
    DECLARE @id varbinary(85)
    DECLARE @who varchar(50)

    SELECT @id = [Transaction SID]
    FROM fn_dblog(NULL, NULL)
    WHERE [Operation] = 'LOP_BEGIN_XACT'
      AND [Transaction ID] = (SELECT TOP 1 [Transaction ID]
                              FROM fn_dblog(NULL, NULL) 
                              WHERE Operation = 'LOP_DELETE_ROWS'
                                AND AllocUnitName like 'dbo.sampletable%'
                              ORDER BY [Transaction ID] DESC)

    SET @who = SUSER_SNAME(@id)

    INSERT sampletableAudit
       SELECT 
          'D' as Operation, Id, Type, @who, getdate()
       FROM 
          deleted
END

1 个答案:

答案 0 :(得分:0)

在活动计算机上,此查询将永久进行。谁知道在查询事务日志的时候,该查询会发生什么。在我的机器上(有一个繁忙的数据库),这已经运行了7分钟,没有结果,所以我停止了它。

如果您正在运行SQL Server 2008,那么使用SQL Server Audit可以获得相同的结果(影响更小,更少)。否则为什么不能只使用user_name?