【问题标题】:Update trigger select fields from same row从同一行更新触发器选择字段
【发布时间】:2014-08-20 19:29:52
【问题描述】:

我想要一个特定字段的更新触发器。如果该字段值发生更改,我想插入到另一个表中,选择进行更新的行的所有值,即使它只是一个字段。

例子

id--------value1--------value2
1-----------abc ----------efg

如果 value1 更新为 hij,我想选择 id(1)、value1(hij) 和 value2(efg) 并插入到不同的表中。

我不能做inserted.Id 或inserted.value2,因为这两个字段都没有更新。

注意:请注意,只有 1 个字段被更新,其他字段值前后相同,在我的问题中,我只是使用了一个示例,但在现实生活中将插入一条记录,我希望插入相同的值到不同的表。但是在插入后,记录才会被批准,直到稍后批准的字段值发生更改时,我才期望将其他字段的值带到不同的表中。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    在您的UPDATE 触发器中,您可以访问包含旧值(在UPDATE 之前)和在UPDATE 之后的新值的DeletedInserted 伪表。

    所以你应该可以这样写:

    CREATE TRIGGER trg_Updated
    ON dbo.YourTableName
    FOR UPDATE
    AS
       INSERT INTO dbo.ThisOtherTableOfYours(Id, Value1, Value2)
          SELECT
             i.Id, i.Value1, i.Value2
          FROM 
             Inserted i
          INNER JOIN
             Deleted d ON i.Id = d.Id
          WHERE 
             i.Value1 <> d.Value1
    

    SELECT 基本上是将两个伪表与旧值和新值连接起来,并选择那些在Value1 列中存在差异的行。

    从这些列中,更新后的新值被插入到您的另一个表中。 Inserted 表确实包含您表中的 ALL 列(及其新值)——不仅仅是那些实际更新的列——ALL

    【讨论】:

    • 谢谢,但请注意只有1个字段被更新,其他字段值前后相同,在我的问题中我只是使用了一个例子,但在现实生活中会插入一条记录,我预计将相同的值插入到不同的表中。但是在插入记录时,直到稍后更改批准的字段值时才会批准记录,这就是我期望将其他字段中的值带到不同表的时候。
    • @HakanZim:当然——没问题——这个触发器可以在这种情况下工作!相信我!此触发器将您需要的值复制 ALLUPDATE 上的另一个表 ....
    【解决方案2】:

    你应该使用一个简单的触发器:

    create or replace trigger NAME on TABLENAME after update as 
       if :new.value1 = 'hij'{
          insert into OTHERTABLE (id, value1, value2) values (:old.id, :old.value1, :old.value2);
       }
    

    【讨论】:

    • 这看起来不适用于(Microsoft)SQL Server - SQL Server 中没有 :new:old ......
    • 注意:请注意只有1个字段被更新,其他字段值前后相同,在我的问题中我只是使用了一个例子,但在现实生活中会插入一条记录,我是期望将相同的值插入到不同的表中。但是在插入记录时,直到稍后更改已批准的字段值时才会批准记录,这就是我期望将其他字段中的值带到不同表的时候。
    • 您要创建的是审计表,其中包含对特定表所做的所有更改。稍后,有特权的人会允许还是拒绝这些更改?
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多