原文链接: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_saleid | f_productname | f_qty |
|---|---|---|
| 1 | tv | 10 |
| 2 | a/c | 20 |
• t_log 表:
| f_logid | f_message | f_operatedate |
|---|---|---|
| 1 | insert:tv | 2024-09-20 |
| 2 | insert:a/c | 2024-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 |
|---|---|---|
| 1 | insert:tv | 2024-09-20 |
| 2 | insert:a/c | 2024-09-20 |
| 3 | update: f_qty->10 | 2024-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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。