代码之家  ›  专栏  ›  技术社区  ›  user7094

SQL Server触发器-按事务分组

  •  2
  • user7094  · 技术社区  · 17 年前

    在工作中,我们刚刚开始为我们的数据库构建审计框架(即记录在创建或更新数据时所更改的数据)。

    我们非常希望使用触发器实现这一点,因为数据有时会从其他地方导入系统,而不仅仅是通过前端。这似乎是一个公平的 common solution .

    不过,我想做一个补充:如果用户运行一个更新多个表的更新,我希望将这些更新分组到一个批中(即为每个更新集生成一个唯一的批ID)。

    问题是,从触发器中获取批处理ID。每个更新都将在事务中运行,因此我想知道是否可以使用事务ID来生成批处理ID。但是,我在T-SQL中找不到访问事务ID的方法。

    有人有什么想法吗?

    p.s.-如果有任何不同,我们将运行SQL Server 2008

    3 回复  |  直到 17 年前
        1
  •  2
  •   Mladen Prajdic    17 年前

    你可以用 从sys.dm_tran_current_事务中选择*。

    sys.dm_tran_current_transaction

        2
  •  1
  •   HLGEM    17 年前

    超出了问题的范围,但在设计审计解决方案时需要考虑的问题。如果要审核包含大容量插入的记录,请确保大容量插入都包含fire_triggers关键字。您还需要确保触发器本身正确地处理多行插入(而不是、不是、不是通过光标!).

        3
  •  0
  •   Eric Petroelje    17 年前

    找到这个 on the net 要获取当前事务ID(然后可以使用该ID生成批处理ID),但不确定它是否工作:

    SELECT TOP 1
    @transactionID = req_transactionID
    FROM
      master..syslockinfo l
    INNER JOIN
      master..sysprocesses p ON l.req_spid = p.spid AND l.rsc_dbid = p.dbid AND p.spid = @@spid
    WHERE
     l.rsc_dbid = db_id() AND p.open_tran != 0 AND req_transactionID > 0
     ORDER BY req_transactionID