我试图在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 未找到。尝试更新只读列。
答案 0 :(得分:1)
您正尝试修改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
触发器在行持久化后触发,允许您查看最终值。< / p>