如何在之前的Informix触发器中放置if语句

时间:2014-03-26 15:23:00

标签: sql informix

我需要制作一个不允许更新“等级”的触发器,其中等级为1.因此,我需要使用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

1 个答案:

答案 0 :(得分:0)

不幸的是,Informix(在当前版本,版本12.10)不支持将嵌入式SPL语句添加到触发器" body"中,因为您有义务创建,所以包含一些逻辑触发器SPL做这项工作......
对于更简单的逻辑或过滤,您可以使用WHEN选项。

那就是说,你的解决方案对我来说似乎不合逻辑......或者你误解了触发器中before, for each row and after动作的概念。

我的意思是:如果使用before操作,触发器将在UPDATE语句之前仅调用一次(无论此更新是否会影响一行,非行或多行)。 /> 如果触发前的 仅执行一次并且(最重要的)之前语句开始运行,他们将如何知道"等级&#34的内容;可能受影响的所有行的字段?

所以,如果你想在"等级"的行中创建一个例外。内容等于1,你没有选项,当+存储过程+引发异常时需要使用 for each row + ...

如果您的数据库已记录(具有事务控制)并且此表为standard(不是RAW表),则引发的异常将中止并回滚受此更新语句影响的所有行。这样你就可以实现目标。

CREATE TRIGGER changeGrade
UPDATE OF grade ON subject
REFERECING OLD AS O
WHEN ( o.grade =1 )   
FOR EACH ROW ( EXECUTE PROCEDURE returnMistake() )