首页 > 解决方案 > 如何使用 Firebird 触发器从表中获取值

问题描述

我想从表中获取一个值并将其与 Firebird 触发器中的插入值进行比较。这是我的代码。

SET TERM ^;

CREATE TRIGGER after_in_systab FOR SYSTEMTAB
ACTIVE AFTER INSERT POSITION 0
AS

declare sys_code integer;
select sys_code from system_table;

BEGIN
    /* enter trigger code here */ 
    if(sys_code == NEW.SYSTEM_CODE) then
    insert into logs(log_detail)values('code matched');
    end
    
END^

SET TERM;^

标签: firebirdfirebird-3.0

解决方案


或者,您可以改用单数选择表达式

CREATE TRIGGER after_in_systab FOR SYSTEMTAB
ACTIVE AFTER INSERT POSITION 0
AS
  declare sys_code integer;
BEGIN
  sys_code = (select sys_code from system_table);
  if(sys_code == NEW.SYSTEM_CODE) then
  begin
    insert into logs(log_detail)values('code matched');
  end
END

如果你的select回报...

  • 一行或多行,则与马克的答案相同(多行时出错)。
  • 不是一行,表达式会返回NULL,而 Mark 的语句什么也不做(变量值没有变化)

您可能还认为 SQLSINGULAR存在谓词以及它与EXISTS一个谓词有何不同。

如果事务回滚(由于任何数据库或网络错误,或由于应用程序命令更改),您还必须清楚地知道应该发生什么ROLLBACK:您的 LOG 是否仍然包含有关未持久化的数据修改的记录或者 LOG 记录是否应该随着它所描述的未插入数据行而消失。

如果是前者,则必须在自治事务中插入日志记录(第 7.6.16 章)。


推荐阅读