0

i have a table named "LogDelete" to save information about users that deleted any rows on any tables. the table fields are like this :

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

Actually i wanna create a trigger that fire on all tables on update action that on every update write proper information on LogDelete Table, at now i use a stored procedure and call it on every update action on my tables. Is there a way to do this?

4

2 回答 2

4

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

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

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

这是一些MSDN 文档,其中说(在关于 DML 触发器的备注中):

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

于 2013-08-04T07:11:00.213 回答
0

对于您的要求,没有什么神奇的解决方案,不是您喜欢event triggers的所有DML( INSERT, UPDATE, DELETE) ,但是您可以考虑一些替代方案:

  1. 如果您使用的是 SQL Server 2008 或更高版本,您可以使用的最好的方法是CDC( Change Data Capture),您可以从 Dave Pinal 的这篇文章开始,我认为这将是最好的方法,因为它不受任何结构更改的影响。
  2. 阅读日志文件。您需要对其进行分析,找到日志中的每个 DML 活动,这样您就可以构建一个统一的操作来记录您需要的更改,显然这不是在线的,也不是微不足道的
  3. 与选项 2 相同,但对所有 DML 活动使用跟踪。这种方法的优点是它几乎可以在线并且不需要分析日志文件,您只需要分析一个分析器表。
于 2013-08-04T07:39:05.220 回答