如何使用 Firebird 触发器从 table 获取值

How to get value from table using Firebird trigger

我想从 table 中获取一个值并将其与 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;^

您需要使用 INTO clause:

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

或者,您可以使用 单一 select 表达式

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 return...

  • 单行或多行,则同(多行时报错)
  • 没有一行,表达式会 return NULL 而 Mark 的语句什么都不做(变量值没有变化)

您可能还会想到 SQL SINGULAR 存在谓词以及它与 EXISTS 有何不同。

您还必须清楚如果事务回滚(因为任何数据库或网络错误,或者因为应用程序命令ROLLBACK 更改):您的日志是否仍包含有关未持久化的数据修改的记录,或者日志记录是否应与其描述的未插入数据行一起消失。

如果是前者,您必须在 autonomous transaction(第 7.6.16 章)中插入日志记录。