簡體   English   中英

如何將if語句在Informix中觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM