在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,特别是(强调我的):

NEWOLD变量受一些规则约束:

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

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

以上是关于在AFTER UPDATE触发器上尝试更新只读列错误的主要内容,如果未能解决你的问题,请参考以下文章

AFTER UPDATE 触发器上的变异表错误

AFTER UPDATE 触发器使用更新表中的聚合

我想创建 AFTER UPDATE 触发器来更新 DATE OF BIRTH where (AGE < 20)

对于50000行的表,MySQL触发器AFTER UPDATE执行速度极慢

SQL AFTER 插入更新触发器

SQLite 创建 AFTER UPDATE 触发器