首页 > 解决方案 > 仅使用已编辑行更新另一个表的触发器

问题描述

是否可以在仅将某人编辑的行输入到新表中的数据库上创建触发器。所以说tbl1有人更改了一个名为“名称”的列。我想获取已编辑的行并将其放入tbl2. 所以我想tbl1只从那个已编辑的行中取出一些其他列并将其存储在一个新表中。我想跟踪更改名称的时间以及日期和时间。这甚至可以通过触发器实现吗?我了解如何为触发事件设置表格。但是我很难理解如何在没有加入的情况下将价值观tbl1带到一起。tbl2

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS  
IF UPDATE(name)
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    INSERT INTO tbl2 (ODID,ID2)
    VALUES ();
END
GO

标签: sqlsql-serverdatabase-trigger

解决方案


根据您的要求,您可以在触发器中使用动态 Sql。

这只是一个想法,

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS 


BEGIN
    SET NOCOUNT ON;
    declare @Sql varchar(500)=''
    declare @Col varchar(500)=''

    IF UPDATE(FirstName)
    set @Col=' FirstName '
    IF UPDATE(LastName)
    set @Col=@Col+', LastName '

    set @Sql='INSERT INTO tbl2 (ODID,ID2)
    select '+@Col+' from inserted'

    sp_executesql @Sql

END
GO

这是非常繁琐的做法。而是创建将作为 tbl1 副本的历史表。

ALTER TRIGGER testname
ON  tbl1
AFTER UPDATE
AS 


BEGIN
    SET NOCOUNT ON;
    insert into tbl1History
    select * from deleted

END
GO

推荐阅读