2012-07-19 83 views
4

下面是我的觸發器:刪除觸發器在多行

ALTER TRIGGER [dbo].[trgPaxeDeleted] 
    ON [dbo].[paxe] 
    AFTER DELETE 
AS 
declare 
@HFflightID int, 
@RFflightID int 

BEGIN 
     Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted 

     -- Hinflug: flugKontingent hochsetzen -- 
     UPDATE flightdata 
     SET  flightQuota = flightQuota + 1 
     WHERE  (flightID = @HFflightID) 

     -- Rückflug: flugKontingent hochsetzen -- 
     UPDATE flightdata 
     SET  flightQuota = flightQuota + 1 
     WHERE  (flightID = @RFflightID) 

END 

這個工程上刪除單行罰款。但是當刪除多行時,只有一次觸發操作完成。

我該如何改變?

回答

10

SQL服務器將觸發火災觸發所有行的一個實例;該deleted表將包含所有行更新,所以你不能單一實例存儲在一個變量。

擺脫下面的代碼行的:

Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted  

你更新statment應該是這樣的:

UPDATE flightdata   
SET  flightQuota = flightQuota + 1   
WHERE  flightID IN (SELECT hfFlightID FROM deleted) 

UPDATE flightdata   
SET  flightQuota = flightQuota + 1   
WHERE  flightID IN (SELECT rfFlightID FROM deleted) 
+0

@AaronBertrand - 我想到了一個'或'聲明,但如果在' flightID'在'hfFlightID'和'rfFlightID'中?它不應該增加兩次嗎?我不知道用戶的數據結構是否可行。如果沒有,那麼是的,肯定合併這兩個陳述。 – LittleBobbyTables 2012-07-19 18:21:46

+0

當您設置一個標量變量,從插入或刪除一個值,你將最有likley不能處理多行的觸發器。當然,觸發測試應該包括多行插入/更新/刪除以及單行測試。最糟糕的部分是它會導致數據完整性問題,因爲觸發器不會失敗,它只會作用於一條記錄。根據我的經驗,最終大多數帶有觸發器的表都需要從文件或某些文件導入數據。總是計劃多行。並且不要使用遊標或while循環來處理多個記錄!這可以殺死數據庫性能。 – HLGEM 2012-07-19 18:31:34

+0

THX您的意見,但仍然只有一個行被刪除 – user168507 2012-07-19 18:44:25

0

刪除觸發器改爲

ALTER TRIGGER [dbo].[trgPaxeDeleted] 
    ON [dbo].[paxe] 
    AFTER DELETE 
AS 
declare 
@HFflightID int, 
@RFflightID int 

BEGIN 

    SET NOCOUNT ON;  

    UPDATE flightdata   
    SET  flightQuota = flightQuota + 1   
    WHERE  flightID IN (SELECT hfFlightID FROM deleted) 

     UPDATE flightdata   
    SET  flightQuota = flightQuota + 1   
    WHERE  flightID IN (SELECT rfFlightID FROM deleted) 

END 
+0

將刪除被刪除觸發另一臺命名爲客戶 – user168507 2012-07-19 19:05:29

+1

解僱我會檢查,看看是否其他的刪除觸發器不正確wirtten只在處理一行。 – HLGEM 2012-07-19 22:02:27

+0

即使我的倍數經由SQL僅刪除一個觸發操作完成(從xxx其中id = 1或ID = 2刪除) – user168507 2012-07-20 09:15:12

1

可以刪除多行。但你必須把多個ID。例如:

DELETE FROM VisitorMaster WHERE Id=85 or Id=86