【问题标题】:SQL Server delete trigger not capturing username (SUSER_SNAME)SQL Server 删除触发器未捕获用户名 (SUSER_SNAME)
【发布时间】:2015-02-26 14:59:49
【问题描述】:

我正在使用 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

【问题讨论】:

  • 除非您使用网络用户名连接到 sql,否则您将无法在 sql 中获取它。这将返回与 sql 建立连接的用户的用户名。
  • 令人困惑的部分是它正确地捕获了插入、更新用户(ad\XXXXX)。

标签: sql sql-server user-interface triggers


【解决方案1】:

在活动机器上,此查询需要永远进行。如果以及何时备份事务日志,谁知道这个查询会发生什么。在我的机器(有一个繁忙的数据库)上,它已经运行了 7 分钟,没有结果,所以我停止了它。

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

【讨论】:

  • 由于某些策略,无法设置 SQL Server 审核。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2020-09-30
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多