2013-08-04 56 views
0

我有一个名为“LogDelete”的表来保存有关删除任何表上的任何行的用户的信息。表中的字段是这样的:创建触发器在所有表上触发

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

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

+0

你的所有表都有一列的int PK吗?如果是,我确实有一个可以帮助你的解决方案。 – OzrenTkalcecKrznaric

回答

4

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

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

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

下面是一些MSDN documentation,它说(在备注有关DML触发器):

CREATE TRIGGER必须是批处理的第一条语句和可以适用于只有一个表

+0

谢谢,你能写出它的脚本吗?我不知道如何创建一个脚本来为所有表运行一次。 –

+0

看看这里:http://www.sqlservercentral.com/Forums/Topic671140-359-1.aspx – GolezTrol

0

没有为你的要求没有神奇的解决方案,没有这样的事,作为event triggers所有DMLINSERTUPDATEDELETE),只要你喜欢,但也有一些替代品,你可以考虑:

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