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

时间:2017-12-20 11:39:32

标签: sql triggers firebird firebird2.5

我试图在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   未找到。尝试更新只读列。

1 个答案:

答案 0 :(得分: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触发器在行持久化后触发,允许您查看最终值。< / p>