南大通用GBase 8s 触发器中 REFERENCING 子句的使用指南

52 阅读4分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在数据库开发中,触发器是一个常用的工具,它可以自动响应表中的数据操作(如插入、更新或删除),并执行预定义的逻辑。GBase 8s 数据库支持在创建触发器时使用REFERENCING NEW AS NEW OLD AS OLD子句,这为开发者提供了更灵活的方式来引用触发器中的新旧数据。本文将详细介绍这一语法的用法,并通过实际示例展示其在数据库开发中的应用。

触发器简介

在深入探讨REFERENCING子句之前,我们先来了解一下触发器的基本概念。在 GBase 8s 数据库中,触发器是一种与表相关联的数据库对象。当对表执行特定操作(如 INSERT 、 UPDATE 、 DELETE )时,触发器会自动执行预定义的 SQL 语句。触发器通常用于实现业务规则、验证数据完整性、记录操作日志等功能。

REFERENCING 子句的作用

在创建触发器时, REFERENCING 子句允许我们通过 NEW 和 OLD 关键字来引用触发器中被修改的数据。具体来说:

  • NEW:用于引用触发器中受到 INSERT 和 UPDATE 操作影响的新数据。
  • OLD:用于引用触发器中受到 UPDATE 和 DELETE 操作影响的旧数据。

通过使用 REFERENCING NEW AS NEW 和 REFERENCING OLD AS OLD ,我们可以为新旧数据指定别名,从而更清晰地在触发器逻辑中引用它们。

 

使用示例

(一)引用新数据( REFERENCING NEW AS NEW )

假设我们有一个名为 t_sale 的表,其中包含列 f_saleid 、 f_productname 和 f_qty 。我们希望在每次插入新记录时,自动将相关信息记录到另一个日志表 t_log 中。以下是实现这一功能的步骤:

1.数据准备

-- 删除已存在的表(如果存在)
drop table if exists t_log;
drop table if exists t_sale;
-- 创建日志表
create table t_log(
   f_logid serial,
   f_message varchar(50),
   f_operatedate date
);
-- 创建销售表
create table t_sale(
   f_saleid serial,
   f_productname varchar(20),
   f_qty int
); 

 

2.创建触发器

-- 创建插入触发器
create or replace trigger trg_sale_insert
   after insert on t_sale
   referencing new as new_item
   for each row
begin
   insert into t_log(f_message, f_operatedate)
   values (concat('insert:', new_item.f_productname), current_date);
end; 

 

3.插入数据并查看结果

-- 插入数据
insert into t_sale(f_productname, f_qty) values ('tv', 10);
insert into t_sale(f_productname, f_qty) values ('a/c', 20);
-- 查看销售表
select * from t_sale;
-- 查看日志表
select * from t_log;  

结果:
•  t_sale 表:

f_saleidf_productname f_qty  
1tv10
2a/c20

  
•  t_log 表:

f_logid f_message f_operatedate 
1insert:tv2024-09-20
2insert:a/c2024-09-20

     

在上述示例中,我们使用了 REFERENCING NEW AS NEW 语法, new_item.f_productname 代表了插入操作影响的新数据的对应字段。

(二)引用旧数据( REFERENCING OLD AS OLD )

接下来,我们继续使用上述表结构,创建一个触发器,用于在每次更新 t_sale 表中的 f_qty 字段时,自动将相关信息记录到 t_log 表中。

1.创建触发器

-- 创建更新触发器
create or replace trigger trg_sale_update
   after update of f_qty on t_sale
   referencing old as old_item
   for each row
begin
   insert into t_log(f_message, f_operatedate)
   values (concat('update: f_qty->', old_item.f_qty), current_date);
end;   

 

2.更新数据并查看结果

-- 更新数据
update t_sale set f_qty = 15 where f_productname = 'tv';
-- 查看日志表
select * from t_log;

结果:
•  t_log 表:

f_logid  f_message f_operatedate  
1insert:tv2024-09-20
2insert:a/c2024-09-20
3update: f_qty->102024-09-20

                   

在上述示例中,我们使用了 REFERENCING OLD AS OLD 语法, old_item.f_qty 代表了更新操作影响的旧数据的对应字段。

通过使用 GBase 8s 数据库中的 REFERENCING NEW AS NEW OLD AS OLD 子句,我们可以更灵活地在触发器中引用新旧数据,从而实现复杂的业务逻辑。无论是记录操作日志、验证数据完整性,还是实现其他业务规则,这一语法都能为开发者提供支持。希望本文的示例能帮助你更好地理解和应用这一功能。

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。