创建一个触发器以在所有表​​上触发

时间:2013-08-04 06:48:36

标签: sql-server tsql triggers

我有一个名为“LogDelete”的表来保存有关删除任何表上任何行的用户的信息。表格字段是这样的:

create table LogDelete
(
    pk int identity(1,1) primary key,
    TableName varchar(15),
    DeleteUser nvarchar(20),
    DeleteDate datetime
)

实际上我想创建一个触发器,触发更新操作上的所有表,在每次更新时都会在LogDelete Table上写入正确的信息, 现在我使用存储过程并在我的表上的每个更新操作上调用它。 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

没有。有'事件'触发器,但它们主要与loggin相关。这些类型的触发器实际上是DDL触发器,因此它们与更新数据无关,而是与更新数据库方案有关。

Afaik,每次更新都没有触发器触发。这意味着您现在通过存储过程处理它的方式可能是最好的方法。您可以在每个表上创建触发器以调用该过程并执行日志记录。

您甚至可以编写一个脚本,在一次运行中为您创建所有这些触发器。这将使触发器的初始创建和稍后更新变得更容易。

以下是一些MSDN documentation,其中(在关于DML触发器的评论中):

  

CREATE TRIGGER必须是批处理中的第一个语句,只能应用于一个表

答案 1 :(得分:0)

您的请求没有神奇的解决方案,而不是event triggers对所有DMLINSERTUPDATEDELETE)这样的问题。比如,但你可以考虑一些替代方案:

  1. 如果你使用的是SQL Server 2008或之后,你可以使用的最好的东西是CDCChange Data Capture),你可以从Dave Pinal的this article开始,我想这会是最好的方法,因为它不受结构变化的影响。
  2. 阅读日志文件。
  3. 你需要分析它,找到日志中的每个DML活动,这样你就可以建立一个统一的操作来记录你需要的变化,显然这不是在线而且不是微不足道的。
  4. 与选项2相同,但在所有DML活动中使用跟踪。这种方法的优点是它几乎可以在线,并且不需要分析日志文件,您只需要分析一个分析器表。