达梦数据库-表级触发器讲解和使用

达梦数据库-表级触发器简单讲解和使用

简介

本章节主要介绍在 DM 数据库中表级触发器的使用。

文章参考:
达梦技术文档

版本如下

名称 版本
DM 数据库 DM 8.0 及以上版本
CPU 架构 x86、ARM、龙芯、飞腾等国内外主流 CPU

1、基本定义

表级触发器的触发动作是三种数据操作命令,即 INSERTDELETEUPDATE 操作。根据触发器的级别可分为元组级(行级)和语句级。

元组级(行级)触发器示例:

-- **行级触发器,对触发命令所影响的每一条记录都激发一次**。
-- 假如一个UPDATE命令更新了500行记录,那么这个表上的元组级UPDATE触发器将被执行500次。
-- 通过FOR EACH ROW子句创建,用一个WHEN子句来限制针对当前记录是否执行该触发器。
-- WHEN子句包含一条布尔表达式,当它的值为TRUE时,执行触发器;否则,跳过该触发器。
CREATE  OR  REPLACE TRIGGER TRG_NAME   [WITH ENCRYPTION]
BEFORE|AFTER|INSTEAD OF 
INSERT OR DELETE OR UPDATE [OF 列名]
ON TABLE_NAME 
FOR EACH ROW  [WHEN 条件] --行级触发器中,此子句一定不能省略
BEGIN
 PRINT 'INSERT OR DELETE OR UPDATE OPERATION ON TABLE_NAME';--要执行的SQL。
END;

以下“[]”内容为可选项:

[WITH ENCRYPTION]:对数据进行加密,加密以后,无法看到触发器里的 sql 语句内容。
UPDATE [OF列名]:如果指定了 UPDATE 命令,还可以进一步指定当表中的哪个列受到UPDATE 命令的影响时激发该触发器。
FOR EACH ROW [WHEN 条件] :对于元组级触发器,可以用一个 WHEN 子句来限制针对当前记录是否执行该触发器。WHEN 子句包含一条布尔表达式,当它的值为 TRUE 时,执行触发器;否则,跳过该触发器。

语句级触发器示例:

-- **语句级触发器,对每个触发命令执行一次**。
-- 一条将500行记录插入表TEST中的INSERT语句,这个表上的语句级INSERT触发器只执行一次。
-- 通过FOR EACH STATEMENT子句创建的,此子句可省略。
CREATE OR REPLACE TRIGGER TRG_NAME
AFTER INSERT OR DELETE OR UPDATE ON TABLE_NAME
FOR EACH STATEMENT -- 语句级:此子句可省略
BEGIN
 PRINT 'INSERT OR DELETE OR UPDATE OPERATION ON TABLE_NAME';--要执行的SQL
END;

触发时机指定:
一、通过指定BEFORE或AFTER关键字,选择在触发动作之前或之后运行触发器;
二、通过指定INSTEAD OF关键字,选择在动作触发的时候,替换原始操作,INSTEAD OF允许建立在视图上,并且只支持行级触发。

应用场景:
元组级触发器常用于数据审计、完整性检查等应用中。
语句级触发器一般用于对表上执行的操作类型引入附加的安全措施。

2、使用案例

业务需求: 现有一张表,在更新其中某一条或多条记录时,字段F_upd_time(更新时间)自动更新为操作执行时的时间。

表结构:

在这里插入图片描述

使用DM可视化工具
在目标模式下的触发器下,选择表级触发器

在这里插入图片描述

右键 新建触发器
触发时间选择 操作之前(BEFORE)
触发的字段除了upd_time都可以勾选上
新旧记录别名分别取 new old
触发条件和加密定义可不选填

在这里插入图片描述

触发器体如图

在这里插入图片描述
点击确定即可
具体sql如下

create or replace trigger "EIP"."trg_upd_w_yljl"
before UPDATE of "ID_","REF_ID_","F_drill_results","F_find_results","F_improvement","F_drill_type","F_departments","F_recorder","F_record_content","F_personnel","F_location","F_time","F_drill_name","F_organization","F_create_time","F_form_data_rev_"
on "EIP"."W_yljl"
referencing OLD ROW AS "old" NEW ROW AS "new"
for each row
BEGIN	
    new.F_upd_time:=sysdate;
END;

猜你喜欢

转载自blog.csdn.net/ChennyWJS/article/details/131913198