[英]How to put if statement in Informix triggers in before
我需要創建一個觸發器,不允許在1級為1的情況下更新“ grade”。因此,我需要在觸發語句before
使用它。 過程returnMistake()
-它僅引發exception
。
我有以下代碼:
CREATE TRIGGER changeGrade
UPDATE OF grade ON subject
BEFORE (
IF (grade = 1) EXECUTE PROCEDURE returnMistake() END IF;
)
我知道我沒有指定grade
任何值,而只是列的名稱,但是我不能放REFERENCING OLD
因為我使用的是BEFORE
而不是FOR EACH ROW
。
我該怎么做? 這在描述語法錯誤的IF
語句處停止。 就示例而言,我將在此處放入Informix中傳遞的代碼:
CREATE TRIGGER changeGrade
UPDATE OF grade ON subject
BEFORE (
EXECUTE PROCEDURE returnMistake()
)
如何使用做BEFORE
? 我會知道如何使用FOR EACH ROW
我只希望對其進行更改,然后將其更改為1,然后將其更改回前一個並調用returnMistake()
,盡管我認為我應該使用BEFORE
。
不幸的是,Informix(當前版本為v12.10)不支持在觸發器“ body”中嵌入嵌入式SPL語句,因為您必須創建一個SPL來完成這項工作,所以在觸發器上包含一些邏輯上的內容並不會令人討厭。
對於更簡單的邏輯或過濾器,可以使用WHEN
選項。
就是說,您的解決方案對我而言似乎並不太合邏輯……或者您誤解了觸發器before, for each row and after
的概念。
我的意思是:如果使用before
動作,則該觸發器將僅在UPDATE語句之前調用一次(無論此更新是否會影響一個,一個或多個行)。
如果before觸發器僅在語句開始運行之前 (並且最重要) 才執行一次,那么他們將如何知道所有可能受影響的行的“ grade”字段的內容?
因此,如果您要在“成績”內容的行等於1的情況下創建異常,則沒有選項,需要for each row
+ when +存儲過程+引發異常使用...
如果您的數據庫已記錄(具有事務控制)並且該表是standard
表(不是RAW
表),則引發的異常將中止並回滾受此update語句影響的所有行。 這樣,您將達到目標。
CREATE TRIGGER changeGrade
UPDATE OF grade ON subject
REFERECING OLD AS O
WHEN ( o.grade =1 )
FOR EACH ROW ( EXECUTE PROCEDURE returnMistake() )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.