更新另一个表中的记录后触发更新表?

时间:2018-01-08 23:44:18

标签: sql-server sql-server-2012 triggers

当table_1上的任何字段更新时,我需要在Table_2上更新字段的触发器。我创建了一个,但是当我更新Table_2上的table_1中的一条记录时,它正在更新所有字段。

示例SQL: -

 Create trigger trigger-1  ON Table_1 After Update  
 As 
 begin  
     SET NOCOUNT ON;   
     Insert into table_2 (Col1,col2,col3,..etc) Select (ins.column names) 
     from  table_1

假设table_1有很多字段,但我仍然需要更新字段。如何使用触发器仅从table_1到table_2获取更新的字段?

2 个答案:

答案 0 :(得分:0)

你的语法错了。您可以使用inserted表。它包含基表的所有列

INSERT INTO table_2 ( col1, col2, col3, . . .)
SELECT  i.cola, i.colb, i.colc, . . .
FROM    inserted i

如果您需要知道哪些列已更新,请使用UPDATE( column name )

https://docs.microsoft.com/en-us/sql/t-sql/functions/update-trigger-functions-transact-sql

答案 1 :(得分:0)

最后,我找到了完美的答案。

如果是UPDATE,则

  

已删除的表将包含旧值,而Inserted表将包含旧值   包含更新后的新值。

根据要求,如果我们想要触发器中的所有字段,我们需要提及表中的所有字段并写下如下内容:

对于更新后的记录:

CREATE TRIGGER trg_ProdUpdate
ON dbo.Production 
AFTER UPDATE
AS
Begin

INSERT INTO dbo.Attribiute (ID, attributeValue, attributetype)

SELECT i.ID, i.prodrecord, i.prodvalue
FROM Production i
INNER JOIN INSERTED d ON i.ID = d.ID

对于UPDATE之前的记录:

CREATE TRIGGER trg_ProdUpdate
ON dbo.Production 
AFTER UPDATE
AS
Begin

INSERT INTO dbo.Attribiute (ID, attributeValue, attributetype)

SELECT i.ID, i.prodrecord, i.prodvalue
FROM Attribiute i
INNER JOIN DELETED d ON i.ID = d.ID

我们可以通过抓取Identical字段(在两种情况下都相同)将Inserted和Deleted加入到某些History表中进行审核。 Deleted表中的旧值,Inserted表中的新值,以及将所有内容存储在单独的表中

为了更好地理解,请查看此链接Trigger insert old values- values that was updated