如何为SQL Server 2008编写一个触发器适用于所有表

3
我写了一个触发器,当 Employee 表更新时触发。
当触发器触发时,它会将新记录插入到 Transact 表中。
ALTER TRIGGER [PROJECTS].[after_updateEmployee] ON [PROJECTS].[Employee]
AFTER  UPDATE
AS DECLARE @tablen varchar(30) , @modyfire  varchar(15),@modyfied_date datetime,@columname   varchar(20),@action varchar(6)
SET @tablen ='Employee'
set @modyfire =(SELECT SYSTEM_USER)
set @modyfied_date =(select CURRENT_TIMESTAMP)
SET @columname = (SELECT TOP 1 E_id  FROM PROJECTS.Employee ORDER BY RV DESC)
set @action ='UPDATE'
BEGIN
INSERT INTO PROJECTS.Transact values(@tablen,@modyfire,@modyfied_date,@columname,@action)
END

我的数据库中有更多的表。那么有没有办法在我的数据库中使用这个触发器来处理所有的表呢?

谢谢。


8
触发器是定义在表上的 - 没有全局触发器的概念。如果您想在10个表上使用触发器,您将需要编写10个触发器 - 分别在每个表上都要写一个。 - marc_s
1
如果您的触发器遵循一种模式,我假设是这样的,您应该能够通过在information_schema上运行select语句来生成脚本,然后自动应用触发器(通过运行脚本)。 - dav1dsm1th
1
补充之前的评论 - 您可以通过创建DDL触发器来自动化新创建的表,以添加适当的触发器到新表中。 - Endrju
1
在SQL Server触发器方面,有两个重要的警告信号。第一个是如果触发器假定只插入/更新/删除了单个行。第二个是如果触发器不包含对“inserted”和/或“deleted”伪表的任何引用。这个触发器似乎存在这两个问题。 - Damien_The_Unbeliever
1个回答

1

根据这里的回答,您可以尝试以下步骤:

创建一个包含对象ID和表格的新类型:

create type table_rows as table
(
    row_id      uniqueidentifier not null,  -- deleted object id
    table_name  varchar(50) not null        -- object's table
);

此函数会将每个被删除的对象记录在auto_log表中:

create procedure mark_as_deleted(@r as table_rows readonly) as
begin
    insert into auto_log (id, row_id, table_name, t_deleted, editor)
        select NEWID(), row_id, table_name, getdate(), current_user from @r
end

最后需要应用到每个表的触发器:

create trigger on_delete_object on [dbo].[object]
instead of delete as
begin
    declare @table table_rows

    insert into @table
        select id, object_schema_name(parent_id) + '.' + object_name(parent_id)
        from deleted
        join sys.triggers on object_id = @@PROCID

    -- Do what ever you need with deleted data
    exec mark_as_deleted @table
end

这种方法的优点在于所有触发器都很熟悉,并且用于处理已删除数据的代码被放置在单独的过程中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接