GBase新闻

专注于数据库软件产品和服务,致力于成为用户最信赖的数据库产品供应商

“G”术时刻 | 深入解析GBase 8s数据库DML触发器的工作机制与实战应用

发布时间:2025-04-27

GBase 8s作为南大通用旗下的一款企业级事务型数据库产品,其健壮的DML触发器功能能够帮助开发者实现自动化任务、数据审计、数据完整性保护等多种应用场景。本文将详细介绍GBase 8s中DML触发器的语法、特性、使用示例以及一些最佳实践,帮助您更好地理解和应用这一功能。

DML 触发器简介

GBase 8s的DML触发器语法,SQLMODE设置要在ORACLE 兼容模式下执行。

DML 触发器定义

当某些数据操作事件发生时,数据库应该采取的操作。在相关的事件发生时,由数据库自动地隐式地激发语句集合,即直到一个语句激发的所有触发器执行完成之后该语句才结束,而其中任何一个触发器执行的失败都将导致该语句的失败。

DML 触发器在表上创建,其触发事件由 DML 语句DELETE、INSERT和UPDATE 组成。

DML 触发器语法

  • create [or replace] trigger [databasename.]trigger_name  ——触发器名称

  • {before|after} ——触发时间

  • { DELETE | INSERT | UPDATE [ OF column [, column ]... ] }

  • [ OR { DELETE | INSERT | UPDATE [ OF column [, column]... ] }... ——触发事件

  • on [databasename.]表名 ——触发对象

  • [REFERENCING  { OLD [ AS ] old  | NEW [ AS ] new}...][ FOR EACH ROW ]  ——触发级别

  • [ ENABLE | DISABLE ] [ WHEN ( condition ) ]  ——触发模式及触发条件

  • PLSQL块   ——触发体

从上述语法可以看到,dml触发器由触发时间、触发时间、触发事件等组成,相关概念解释如下:

触发时间:触发事件和该 TRIGGER 的操作顺序。 BEFORE 指明触发器在执行触发语句之前激发;AFTER 指明触发器在执行触发语句之后激发;

触发事件:引起触发器被触发的 DML 语句事件,包括 INSERT 、DELETE 、UPDATE;

触发对象:被定义触发器的数据库对象,当前版本仅支持基表;

触发操作/触发体:即该 TRIGGER 被触发之后要执行的 PLSQL 语句块;

触发级别:即语句级触发器和行级触发器;

语句级触发器:是指当某触发事件发生时,该触发器只执行一次;

行级触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次,使用 FOR EACH ROW 定义;

触发模式:设置触发器为启用(ENABLE)或禁用(DISABLE);

触发条件:由 WHEN 子句指定一个逻辑表达式。必须在行级触发器下使用,即必须与FOR EACH ROW 一同使用。只有当该表达式的值为 TRUE 时,遇到触发事件才会自动执行触发器,使其执行触发操作。

DML 触发器中新、旧行值的引用

仅在行级触发器,可以使用新、旧行值的引用访问正在处理的行中的数据;

缺省的引用名是:OLD、NEW,可使用REFERENCING 子句修改;

OLD表示记录被处理前的值;NEW 表示记录被处理后的值。

在触发体内,使用以下语法引用新旧行的字段:

引用名.列名

OLD、NEW不同触发事件下含义如下:

DML 触发器中触发体的补充说明

DML触发器的触发体是由PLSQL块语法定义。SQLMODE 在 ORACLE 兼容模式下,触发器触发体定义需支持 PLSQL语法定义。

<触发体> ::=[ DECLARE <声明部分>]BEGIN<执行部分>END [触发器名称];

当前版本已实现的 PLSQL 语法在触发体部分均支持。

DML 触发器使用示例

注意:以下所用示例使用的数据库版本为:GBase8sV8.8_TL_3.5.1_x86_64

用例1:多个触发事件的DML触发器

用例2:禁用/启用触发器

用例3:删除触发器

说明:删除触发器的触发对象后,其相关的触发器都会被自动删除。

用例4:新旧值的引用_insert_新值

用例5:新旧值的引用_insert_旧值

用例6:新旧值的引用_delete_旧值

用例7:新旧值的引用_delete_新值

以上为DML触发器使用的简单介绍,通过合理使用DML触发器,可以显著提高数据库的自动化程度和数据管理效率。希望本文的介绍和示例能够帮助您更好地理解和应用DML触发器。如果您有任何疑问或需要进一步的帮助,欢迎随时在社区中提问。