繁体   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