2015-05-17 48 views
-1

觸發器我使用觸發器,現在我面臨的一些問題是第一次,如何編寫一個基於行的更新

我有3個表,InvoiceHead,InvoiceDetails,InventoryMaster。

當我更新InvoiceHead的「狀態」字段(從0到1)時,需要根據更新的行更改InvoiceDetails和InventoryMaster的「狀態」字段。

Reltionships: InvoiceHead_id = InvoiceDetails_id(FK)和 InventoryMaster_Processid = InvoiceHead_id(FK)

怎麼能寫在InvoiceHead觸發?

請幫忙解決這個..

回答

1

試試這個

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中橫行。所以如果這個觸發器會一次觸發多於一行,我的代碼將無法滿足您的要求..您需要微調它..

+0

謝謝你的朋友,這工作正常,你能清除我嗎你不是很忙,你有什麼提到的abt整個行更新問題的SQL相比於oracle?我認爲我的觸發器現在完美工作在基於行的更新,其在sqlserver 2008 –

+0

你的觸發器有**主要**缺陷,你似乎認爲它會被稱爲**每行一次** - 這是**不是** 案子。觸發器將在每個語句**中觸發一次**,所以如果你的UPDATE語句影響了25行,你將觸發**觸發**一次,但是,然後「插入」和「刪除」將分別包含25行。您的代碼在這25行中選擇哪一個?從插入的i中選擇@ status = i.status;' - 這是非確定性的,你會得到一個任意的行,並且你將**忽略所有其他的行。你需要重寫你的觸發器來考慮這個問題! –

+0

@marc_s是你說的是正確的..這就是我在上次聲明中提到的..在SQL觸發器工作的整個更新語句,如果25更新發生此觸發器將立即觸發25不像在oracle中一行一行。我要求他注意的問題 – Sachu