在AFTER UPDATE触发器上尝试更新只读列错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在AFTER UPDATE触发器上尝试更新只读列错误相关的知识,希望对你有一定的参考价值。
我正在尝试在firebird 2.5上创建一个触发器,以便在更新另一列时更新列。我为我的尝试创建了一个示例简单表。
create tablea (estado char(1), fl_previa_laudo char(1));
我的触发器是这样的:
create trigger ATUALIZA_PREVIA_AI for TABLEA
active after update position 0
as
begin
if( old.estado in ('3', '4', '7', '8') ) then
new.fl_previa_laudo = 'T';
else
new.fl_previa_laudo = 'F';
end;
当我运行触发器时,它会出错:
无法格式化消息13:849 - 找不到消息文件C: Windows firebird.msg。尝试更新只读列。
答案
您正在尝试修改AFTER UPDATE
触发器中的列,但这是不可能的。如果要修改值,则需要使用BEFORE UPDATE
触发器。请参阅Firebird documentation on triggers,特别是(强调我的):
NEW
和OLD
变量受一些规则约束:
- 在所有触发器中,
OLD
值是只读的- 在
BEFORE UPDATE
和BEFORE INSERT
代码中,NEW
值是读/写,除非它是COMPUTED BY
列- 在
INSERT
触发器中,对OLD
变量的引用无效并将引发异常- 在
DELETE
触发器中,对NEW
变量的引用无效并将引发异常- 在所有
AFTER
触发器代码中,NEW
变量是只读的
换句话说,before update
触发器允许您在行持久化之前修改值,而after update
触发器在行持久化后触发,允许您查看确定的值。
以上是关于在AFTER UPDATE触发器上尝试更新只读列错误的主要内容,如果未能解决你的问题,请参考以下文章
我想创建 AFTER UPDATE 触发器来更新 DATE OF BIRTH where (AGE < 20)