Sql 如何基于行更新写入触发器

Sql 如何基于行更新写入触发器,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我第一次使用触发器,现在我面临一些问题 我有3张桌子,发票头,发票明细,库存管理员 当我更新InvoiceHead的“状态”字段(从0到1)时,需要根据更新的行更改InvoiceDetails和InventoryMaster的“状态”字段 关系: 发票头\u id=发票明细\u id(FK)和 InventoryMaster\u Processid=InvoiceHead\u id(FK) 如何在InvoiceHead中写入触发器 请帮助解决此问题。试试这个 create trigger you

我第一次使用触发器,现在我面临一些问题

我有3张桌子,发票头,发票明细,库存管理员

当我更新InvoiceHead的“状态”字段(从0到1)时,需要根据更新的行更改InvoiceDetails和InventoryMaster的“状态”字段

关系: 发票头\u id=发票明细\u id(FK)和 InventoryMaster\u Processid=InvoiceHead\u id(FK)

如何在InvoiceHead中写入触发器

请帮助解决此问题。

试试这个

create trigger your_trigger
on InvoiceHead
after update
as
//declare @status int;
//select @status=i.status from inserted i;  
//IF @status == 1 
//BEGIN

update d
set d.status = b.status
from InvoiceDetails as d
join inserted as b 
on a.InvoiceDetails_id = b.InvoiceHead_id
where b.status == 1; 

update m
set m.status = b.status
from InventoryMaster  as m
join inserted as b 
on m.InventoryMaster_Processid = b.InvoiceHead_id
where b.status == 1;


end
go  

但请记住,在SQL中,触发器在整个更新中起作用,而不像oracle中的rowwise。因此,如果此触发器一次触发多行,我的代码将无法满足您的要求。您需要对其进行微调。

谢谢您,朋友,这很好,如果您不忙,您能澄清我的问题吗?您提到的SQL相对于oracle的整个行更新问题?我认为我的触发器现在在基于行的更新中工作得很好,它在SQLServer2008YourTrigger中有一个主要的缺陷,您似乎认为它每行调用一次—事实并非如此。每个语句触发一次触发器,因此如果
UPDATE
语句影响25行,您将触发一次触发器,但是
Inserted
Deleted
将分别包含25行。您的代码将在此处选择这25行中的哪一行<代码>从插入的i中选择@status=i.status-这是不确定的,您将得到任意一行,而忽略所有其他行。你需要重写你的触发器来考虑这一点@marc_是的,你所说的是正确的。这就是我在上一句话中提到的。在sql触发器对整个更新语句的工作中,如果发生25次更新,此触发器将对25次更新立即触发,而不是像oracle中那样逐行触发。这就是我要求他处理的问题,但你发布的代码没有处理这一问题!这就是我要说的——你说你必须小心——但是你自己的代码违反了这个建议……@AmjadhNm在oracle中,如果为更新或插入编写触发器,它将逐行触发。但在sql中并非如此。触发器将立即对整个更新执行。请参阅marc_的评论。如果此答案有助于您投票。。