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