我需要制作一个不允许更新“等级”的触发器,其中等级为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
。
答案 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() )