【问题标题】:Create a trigger that updates a column in a table when a different column in the same table is updated - SQL创建一个触发器,当同一表中的不同列更新时更新表中的列 - SQL
【发布时间】:2023-03-17 20:05:02
【问题描述】:

当更新同一个表中的不同列时,如何创建一个触发器来更新表中的列。

到目前为止,我已经完成了以下在创建任何新数据时有效的操作。它能够将数据从“Purchase Requisition”复制到“PO_Number”,但是当“Purchase Requisition”中的数据已被修改时,“PO_Number”不会发生任何更改,并且该值变为 NULL。任何帮助将不胜感激。

ALTER TRIGGER [dbo].[PO_Number_Trigger]
ON [dbo].[TheCat2]
AFTER INSERT 
AS BEGIN

   UPDATE  dbo.TheCat2 SET PO_Number=(select Purchase_Requisition from inserted)  where DocNo= (Select DocNo from inserted);
   END

【问题讨论】:

  • 您的触发器不是批处理安全的......

标签: sql sql-server tsql triggers


【解决方案1】:

您需要添加'UPDATE'以及插入到触发器中,否则它将仅对新数据执行,而不是更新数据。还在插入表中的 select 语句中添加了“前 1”,以使其在批量更新时“安全”,但它只会更新 1 条记录。

ALTER TRIGGER [dbo].[PO_Number_Trigger]
ON [dbo].[TheCat2]
AFTER INSERT, UPDATE 
AS BEGIN

   UPDATE  dbo.TheCat2 SET PO_Number=(select top 1 Purchase_Requisition from inserted)  where DocNo= (Select top 1 DocNo from inserted);
END

【讨论】:

  • 非常感谢您,非常了解 SQL 脚本并感谢您的帮助。总是乐于学习新东西。
【解决方案2】:

这可能会做你想做的事: 您的触发器正在更改 TheCat2 中的所有行。大概,您只想更改新的:

ALTER TRIGGER [dbo].[PO_Number_Trigger]
ON [dbo].[TheCat2] AFTER INSERT 
AS
BEGIN 
   UPDATE tc
       SET PO_Number = Purchase_Requisition
       FROM dbo.TheCat2 tc JOIN
            inserted i
            on tc.DocNo = i.DocNo ;
END;

但是,对于您的目的,也许计算列就足够了:

alter table add PO_Number as Purchase_Requisition;

【讨论】:

  • 非常感谢。感谢所有的帮助。我很高兴我总能在这里学到新东西..
猜你喜欢
  • 2011-02-10
  • 2023-03-23
  • 1970-01-01
  • 2015-08-18
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 2018-01-12
相关资源
最近更新 更多