2016-04-01 62 views
0

我在寫一個控制列的觸發器。腳本按我想要的方式工作,但我的問題在於引發錯誤。我希望觸發器能夠在不向用戶顯示錯誤信息的情況下工作。中斷沒有框消息的觸發器執行(tsql)

任何人都可以知道什麼是raiseerror的等價物而不會向用戶顯示錯誤消息嗎?

我嘗試了回滾事務,它給我提供了另一個錯誤消息,而我嘗試使用不會中斷觸發器執行的返回。

這是我的觸發器:

DECLARE @val varchar(9) 
SELECT @val= [DC_Piece] 
from INSERTED 
where INSERTED [DC_Domaine]=0 and INSERTED.[DC_IdCol]=6 

IF UPDATE([DC_Piece]) 
BEGIN 
IF NOT EXISTS(select [DO_PIECE] 
from DOCEN 
where @val= [DO_Piece] and [DO_Domaine]=0 and [DO_Type]=6) 
    RAISERROR('STOP',11,1) 
END 

請幫我

+1

你的觸發器有** **主要中的缺陷,你似乎認爲它會被稱爲**每排一次** - 這是**不* * 案子。觸發器將在每個語句**中觸發一次**,因此如果您的INSERT語句插入了25行,您將觸發一次觸發**,但隨後插入的行將包含25行。您的代碼在這25行中選擇哪一個? 'SELECT @ val = [DC_Piece] from INSERTED' - 這是非確定性的 - 你會得到一個任意的*行,並且你將**忽略所有其他的!你需要重寫你的觸發器來考慮這個問題! –

+0

好吧,你能給我一個例子懇求 – hollyx

+0

看到我的迴應 –

回答

1

您需要完全重寫你的觸發考慮到這將每條語句(被稱爲每行一次!)和InsertedDeleted僞表可以包含您應該考慮的多行。

因此,嘗試這樣的事:

CREATE TRIGGER trg_abort_insert 
ON dbo.YourTableNameHere 
AFTER UPDATE 
AS 
    -- check if any of the DC_Piece columns have been updated 
    IF EXISTS (SELECT * 
       FROM Inserted i 
       INNER JOIN Deleted d ON i.PrimaryKey = d.PrimaryKey -- link the two pseudo tables on primary key 
       WHERE i.DC_Piece <> d.DC_Piece -- DC_Piece has changed 
       AND i.DC_Domaine = 0 
       AND i.DC_IdCol = 6) 
     -- if your conditions are met --> just roll back the transaction 
     -- nothing will be stored, no message is shown to the user 
     ROLLBACK TRANSACTION     
END 
+0

感謝您的回覆,但我現在得到了這個錯誤信息,顯示:事務在觸發器中結束,批處理已被刪除 – hollyx