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

文章介绍了达梦数据库DM8.0及以上版本中表级触发器的使用,包括元组级和语句级触发器的概念、创建语法及应用场景。元组级触发器在数据操作时对每条记录触发,而语句级触发器对整个操作触发一次。触发器常用于数据审计和完整性检查,示例展示了如何创建一个在更新记录前自动更新更新时间的触发器。

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

简介

本章节主要介绍在 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;
<think>首先,用户的问题是关于达梦数据库触发器类型、适用场景使用方法。我需要在回答中参考提供的引用内容。 回顾提供的引用: - 引用[1]:提到达梦数据库触发器语法功能与Oracle较接近,支持行语句触发器,并可使用:old:new引用更新前后的值。适用场景包括数据完整性控制、自动数据处理审计跟踪。 - 引用[2]:展示了一个替代(instead of)触发器的例子,创建了一个并编写触发器- 引用[3]:详细讲解触发器使用,包括WITH ENCRYPTION、UPDATE OF列名、FOR EACH ROW WHEN条件等选项。 用户的问题是基于这些引用,询问触发器类型、适用场景使用方法。 我的回答需要遵循系统指令: 1. 行内数学达式用$...$,但在这个主题中,可能不需要数学达式,除非涉及公式。如果有变量或简单达式,就用$...$。 2. 独立公式用$$...$$并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层要求:回答结构清晰,逐步解决问题,保证真实可靠。 结构化回答: 1. **引言**:简要介绍达梦数据库触发器。 2. **触发器类型**:基于引用,达梦支持行语句触发器(来自[1]),以及替代触发器(来自[2])。引用[3]提到FOR EACH ROW,这是行触发器的标志。可能类型包括: -触发器(row-level) - 语句触发器(statement-level) - 替代触发器(instead of triggers) 引用[1]说支持行语句,引用[2]提到instead of触发器。 3. **适用场景**:基于引用[1],适用场景有数据完整性控制、自动数据处理、审计跟踪。 4. **使用方法**:从引用[2][3]中提取。包括创建触发器的语法、选项如WITH ENCRYPTION、UPDATE OF列名、FOR EACH ROW WHEN条件等。 引用[2]给出了一个例子:创建WEATHER,然后编写触发器。我需要描述基本语法。 引用[3]详细解释了选项。 5. **示例**:提供一个简单的代码示例来演示创建触发器。基于引用[2],可以扩展。 6. **结尾**:总结,并生成相关问题。 添加引用标识:在回答中,当引用内容时,在段落末尾添加, [^2], [^3]。 例如:达梦数据库支持行语句触发器[^1]。 生成相关问题:在回答结束时,添加§§相关问题§§部分,列出几个相关问题。 可能的三个相关问题: 1. 达梦数据库触发器的性能影响如何? 2. 如何调试达梦数据库中的触发器? 3. 达梦数据库触发器的限制有哪些? 确保回答真实可靠:基于提供的引用,不要添加未提供的信息。 完整回答结构: - 开头:回答用户问题。 - 主体: - 类型:行、语句、替代触发器- 场景:完整性、自动处理、审计。 - 方法:语法、关键选项。 - 示例代码。 - 结尾:总结。 - 相关问题。 在LaTeX格式方面:由于是数据库主题,可能不需要数学达式。但如果提到计数或简单变量,用$...$。例如,在描述条件时。 例如,在WHEN条件中,如果有布尔达式,可能用$...$。 但保持简单。 最终回答: </think> ### 达梦数据库触发器的类型、适用场景使用方法 达梦数据库(DM Database)的触发器是一种在特定数据库事件发生时自动执行的存储过程,常用于实现数据驱动的自动化逻辑。其语法功能与Oracle数据库较接近,支持多种触发器类型丰富选项[^1]。下面我将基于引用内容,逐步为您详细解释触发器的类型、适用场景使用方法。 #### 1. **触发器类型** 达梦数据库主要支持三种触发器类型,每种类型适用于不同粒度的事件: - **行触发器(Row-Level Trigger)**:当事件影响中的每一行时触发。例如,在INSERT、UPDATE或DELETE操作中,每修改一行数据就会执行一次触发器。行触发器使用`FOR EACH ROW`关键字定义,并可以通过`:old``:new`引用更新前后的值(如`:old.TEMP`示更新前的温度值)。 - **语句触发器(Statement-Level Trigger)**:当事件影响整个SQL语句时触发一次,无论语句修改了多少行数据。例如,一个UPDATE语句更新多行时,语句触发器只执行一次。这种触发器常用于批量操作的处理。 - **替代触发器(Instead Of Trigger)**:主要用于视图操作,替代原有的DML(数据操纵语言)操作。例如,当对一个视图执行INSERT时,替代触发器可以重写操作逻辑,实现自定义处理。引用[2]中的例子展示了在创建后编写替代触发器的过程。 这些类型的选择取决于业务需求:行触发器适合精细控制数据变更,语句触发器适用于全局性操作,而替代触发器常用于视图的复杂逻辑处理。 #### 2. **适用场景** 触发器的核心应用场景包括数据完整性控制、自动数据处理审计跟踪[^1]: - **数据完整性控制**:确保数据一致性约束。例如,在更新温度数据时,通过行触发器检查值是否有效(如当$ \text{TEMP} < -273.15 $时拒绝更新)[^2]。 - **自动数据处理**:实现自动化业务逻辑。例如,在插入新天气记录时,自动计算并填充衍生字段(如风速平均值)。 - **审计跟踪**:记录数据变更历史。例如,使用语句触发器在修改关键时写入审计日志,追踪谁在何时修改了数据[^1]。 触发器尤其适用于需要实时响应数据变更的场景,但需注意过度使用可能影响性能[^3]。 #### 3. **使用方法** 创建触发器的基本语法基于SQL标准,并支持多种选项来定制行为[^3]。以下是关键步骤选项: - **基本语法**: ```sql CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name [FOR EACH ROW] [WHEN (condition)] [WITH ENCRYPTION] BEGIN -- 触发器逻辑(使用PL/SQL类似语法) END; ``` - `BEFORE/AFTER/INSTEAD OF`:指定触发器在事件之前、之后或替代事件执行。 - `FOR EACH ROW`:定义行触发器;省略则示语句触发器- `WHEN (condition)`:添加布尔条件,限制触发器执行(例如,`WHEN (new.TEMP > 0)`只在温度大于0时触发)[^3]。 - `WITH ENCRYPTION`:加密触发器代码,防止SQL语句被查看。 - `UPDATE OF列名`:指定仅当特定列更新时触发(例如,`UPDATE OF TEMP`只在温度列更新时执行)。 - **示例:创建一个行触发器** 基于引用[2]中的`WEATHER`(结构:`CREATE TABLE WEATHER(STATION_ID CHAR(5), RTIME TIMESTAMP, TEMP FLOAT DEFAULT -273.15, ...)`),我们创建一个触发器,在插入新记录时自动检查温度值是否合法: ```sql CREATE OR REPLACE TRIGGER check_temp_trigger BEFORE INSERT ON WEATHER FOR EACH ROW WHEN (new.TEMP < -273.15) -- 条件:温度不能低于绝对零度 BEGIN RAISE_APPLICATION_ERROR(-20001, 'Invalid temperature value'); -- 抛出错误 END; ``` 这个触发器在插入数据前检查`TEMP`值,如果低于$-273.15$(绝对零度),则拒绝操作并报错[^2]。 - **使用注意事项**: - 引用`:old``:new`在行触发器中访问更新前后的值(如`:new.TEMP`)。 - 替代触发器常用于视图,语法类似但用`INSTEAD OF`关键字[^2]。 - 性能优化:避免在触发器中执行耗时操作;可使用`WHEN`条件减少不必要的执行。 总之,达梦数据库触发器功能强大且灵活,通过合理选择类型选项,能高效实现数据驱动的自动化需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值