本章节主要介绍在 DM 数据库中触发器的使用。
适用场景
| 软件 | 版本 |
|---|---|
| 操作系统 | Redhat 7 及以上版本 |
| DM 数据库 | DM 8.0 及以上版本 |
| CPU 架构 | x86、ARM、龙芯、飞腾等国内外主流 CPU |
操作方法
表级触发器
表级触发器的触发动作是三种数据操作命令,即 INSERT、DELETE 和 UPDATE 操作。
- 创建触发器,如下所示:
CREATE OR REPLACE TRIGGER TRG_NAME |
行级触发器,对触发命令所影响的每一条记录都激发一次。
CREATE OR REPLACE TRIGGER TRG_NAME |
语句级触发器,对每个触发命令执行一次。
- 创建
BEFORE触发器,该触发器在插入一条记录前,将记录中第一列 READER_ID 的值加 1。如下所示:
//进入数据库 OTHER 模式 |
插入记录前:

插入一条记录:
insert into OTHER.READER(READER_ID, NAME, AGE, GENDER, MAJOR) |
插入记录后:

插入的 READER_ID 值为 13 ,插入时触发:NEW.READER_ID:=:NEW.READER_ID+1,提交的 READER_ID 值为 14。
- 创建 AFTER 触发器,该触发器在插入一条记录后,将插入的值以及操作类型记录到用于审计的表
T_TEMP中。如下所示:
CREATE TABLE T_TEMP(C1 INT,C2 CHAR(20)); |
插入一条记录:
insert into OTHER.READER(READER_ID, NAME, AGE, GENDER, MAJOR) |
插入记录后:

提交后插入数据到表 T_TEMP 中。
- 创建
INSTEAD OF触发器,该触发器在动作触发的时候,替换原始操作,INSTEAD OF 允许建立在视图上,并且只支持行级触发。如下所示:
//创建视图 v1 |
执行 UPDATE 动作:
update v1 set a=100 where a=10; |
查询结果:

更新操作并没有成功,而是被触发器中的替换动作替换了。
时间触发器
时间触发器属于一种特殊的事件触发器,可以定义一些有规律性执行的、定点执行的任务。
- 创建时间触发器,在屏幕上每隔一分钟输出一行
HELLO WORLD。如下所示:
CREATE OR REPLACE TRIGGER timer2 |
时间触发器的最低时间频率精确到分钟级,定义很灵活,完全可以实现数据库中的代理功能,只要通过定义一个相应的时间触发器即可。在触发器体中定义要做的工作,可以定义操作的包括执行一段 SQL 语句、执行数据库备份、执行重组 B 树、执行更新统计信息、执行数据迁移 (DTS)。
触发器管理
- 每个触发器创建成功后都自动处于允许状态 (ENABLE),当不想被触发,但是又不想删除这个触发器。这时,可将其设置关闭触发器 (DISABLE)。
//关闭触发器 |
- 触发器删除
DROP TRIGGER OTHER.TRG_INS_AFTER; |
- 触发器查看
//查看当前数据库的全部触发器 |
输出结果:

注意
- <触发器名>是触发器的名称,它不能与模式内的其他模式级对象同名。
- 可以使用
OR REPLACE选项来替换一个触发器,但是要注意被替换的触发器的触发表不能改变。如果要在同一模式内不同的表上重新创建一个同名的触发器,则必须先删除该触发器,然后再创建。INSTEAD OF触发器仅允许建立在视图上,并且只支持行级触发。- 表级触发器不支持跨模式,即<触发器名>必须和<触发表名>、<触发视图名>的模式名一致。
- 水平分区子表、HUGE 表不支持表级触发器。
参考文献
更多 SQL 语言使用说明,请参考《DM_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹下。如有其他问题,请在社区内咨询。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




