在AFTER UPDATE触发器上尝试更新只读列错误

问题描述 投票:1回答:1

我正在尝试在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。尝试更新只读列。

sql triggers firebird firebird2.5
1个回答
1
投票

您正在尝试修改AFTER UPDATE触发器中的列,但这是不可能的。如果要修改值,则需要使用BEFORE UPDATE触发器。请参阅Firebird documentation on triggers,特别是(强调我的):

NEWOLD变量受一些规则约束:

  • 在所有触发器中,OLD值是只读的
  • BEFORE UPDATEBEFORE INSERT代码中,NEW值是读/写,除非它是COMPUTED BY
  • INSERT触发器中,对OLD变量的引用无效并将引发异常
  • DELETE触发器中,对NEW变量的引用无效并将引发异常
  • 在所有AFTER触发器代码中,NEW变量是只读的

换句话说,before update触发器允许您在行持久化之前修改值,而after update触发器在行持久化后触发,允许您查看确定的值。

© www.soinside.com 2019 - 2024. All rights reserved.