Sql server 创建一个触发器来触发所有表

Sql server 创建一个触发器来触发所有表,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我有一个名为LogDelete的表,用于保存删除任何表上任何行的用户的信息。表字段如下所示: create table LogDelete ( pk int identity(1,1) primary key, TableName varchar(15), DeleteUser nvarchar(20), DeleteDate datetime ) 实际上,我想创建一个触发器,在更新操作时触发所有表,在每次更新时在LogDelete表上写入正确的信息, 现在,我

我有一个名为LogDelete的表,用于保存删除任何表上任何行的用户的信息。表字段如下所示:

create table LogDelete
(
    pk int identity(1,1) primary key,
    TableName varchar(15),
    DeleteUser nvarchar(20),
    DeleteDate datetime
)
实际上,我想创建一个触发器,在更新操作时触发所有表,在每次更新时在LogDelete表上写入正确的信息, 现在,我使用一个存储过程,并在表上的每个更新操作上调用它。
有办法做到这一点吗

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

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

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

以下是一些关于DML触发器的评论:

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


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

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

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

以下是一些关于DML触发器的评论:

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


对于您的请求,没有神奇的解决方案,也没有像事件触发器这样的事件触发所有DML INSERT、UPDATE、DELETE(如您所愿),但您可以考虑一些替代方案:

如果您使用的是SQL Server 2008或更高版本,那么最好使用的是CDC更改数据捕获,您可以从Dave Pinal开始,我认为这将是最好的方法,因为它不受任何结构更改的影响。 读取日志文件。您需要对其进行分析并在日志中找到每个DML活动,这样您就可以构建一个统一的操作来记录所需的更改,显然这不是在线的,也不是微不足道的 与选项2相同,但对所有DML活动使用跟踪。这种方法的优点是它几乎可以在线,并且不需要分析日志文件,您只需要分析探查器表。
对于您的请求,没有神奇的解决方案,也没有像事件触发器这样的事件触发所有DML INSERT、UPDATE、DELETE(如您所愿),但您可以考虑一些替代方案:

如果您使用的是SQL Server 2008或更高版本,那么最好使用的是CDC更改数据捕获,您可以从Dave Pinal开始,我认为这将是最好的方法,因为它不受任何结构更改的影响。 读取日志文件。您需要对其进行分析并在日志中找到每个DML活动,这样您就可以构建一个统一的操作来记录所需的更改,显然这不是在线的,也不是微不足道的 与选项2相同,但对所有DML活动使用跟踪。这种方法的优点是它几乎可以在线,并且不需要分析日志文件,您只需要分析探查器表。
谢谢,你能写剧本吗?我不知道如何创建一个脚本,以便为所有表运行一次。谢谢,您可以编写它的脚本吗?我不知道如何为所有表创建一个运行一次的脚本。您的所有表都有一列int PK吗?如果是,我有一个解决方案可以帮助您。您的所有表都有一列int PK吗?如果是,我确实有一个解决方案可以帮助您。