更新同一行的触发器选择字段

时间:2014-08-20 19:29:53

标签: sql sql-server tsql

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

示例

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

如果value1更新为hij,我想选择id(1),value1(hij)和value2(efg)并插入另一个表。

我无法执行inserted.Id或inserted.value2,因为两个字段都没有更新。

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

2 个答案:

答案 0 :(得分:1)

UPDATE触发器中,您可以访问包含旧值(Deleted之前)的InsertedUPDATE伪表以及之后的新值UPDATE

所以你应该写下这样的东西:

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表格确实包含来自您表格的所有列(及其新值) - 不仅仅是那些已经实际更新的列 - 全部!< / p>

答案 1 :(得分:0)

您应该使用简单的触发器:

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);
   }