關於SQLServer2005的學習筆記——多觸發器執行問題

bq_wang發表於2010-01-27
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE問題描述:

在某環境中資料表存在多個觸發器,資料的增刪改是標準的每個表都有的觸發器,此外還存在關於校驗的觸發器;起因是寫完觸發器後,有一次同事詢問說觸發器不起作用了,沒有提示錯誤,但是資料無法儲存;我也有點莫名其妙,在查詢分析器中執行直接就提示錯誤了,可在應用程式中無法提示錯誤。

同事提醒說需要執行一段設定觸發器觸發先後順序的程式碼,查了一下為sp_settriggerorder;看了下幫助修改了一下即可。不過只看SQLServer聯機幫助似乎是無法理解的,透過此次才瞭解該儲存過程的意義。

以下為聯機幫助中的釋義。

sp_settriggerorder

指定第一個或最後一個激發的、與表關聯的 AFTER 觸發器。在第一個和最後一個觸發器之間激發的 AFTER 觸發器將按未定義的順序執行。

語法

sp_settriggerorder[@triggername = ] 'triggername'
    ,
[@order = ] 'value'
    ,
[@stmttype = ] 'statement_type'

 

做個簡單測試,新建2張表和2個觸發器

CREATE TABLE TestA

(

  a VARCHAR(20)

);

CREATE TABLE TestB

(

  a VARCHAR(20)

);

ALTER  TRIGGER [Tri_Test1] ON TestA

AFTER INSERT,UPDATE

AS

SET NOCOUNT ON

DECLARE @a VARCHAR(20)

SELECT @a=a FROM INSERTED

IF @a='A' OR @a='a'

BEGIN

         RAISERROR ( '該條記有問題,不能重複儲存!', 16, 1 )

         ROLLBACK TRAN

         RETURN

END

 

ALTER  TRIGGER [Tri_Syn_Test1] ON TestA

AFTER INSERT,UPDATE

AS

SET NOCOUNT ON

INSERT INTO TestB SELECT a FROM inserted

COMMIT;

 

 

TestA表插入一個A值,系統提示該條記有問題,不能重複儲存!

但是假如在應用程式中的話,很可能系統不會提示錯誤,但是儲存失敗,原因是Tri_Syn_Test1一定會執行成功,而應用程式捕獲不到後面觸發器中的錯誤了。

這個時候需要將Order設定為first

INSERT INTO TestA VALUES('A')

sp_settriggerorder @triggername= '30SJK_TEST_U.Tri_Test1', @order='first', @stmttype = 'UPDATE';

sp_settriggerorder @triggername= '30SJK_TEST_U.Tri_Test1', @order='first', @stmttype = 'INSERT';

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-626166/,如需轉載,請註明出處,否則將追究法律責任。

相關文章