达梦数据库的触发器介绍与使用
触发器的概述触发器可以理解成为一种特殊类型的存储过程,但它不同于存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。触发器主要是通过一定的操作(诸如Update、 Insert、 Delete 这些操作时)来触发自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。触发器的主要作用就是其能够实现由主键和外键所不能保
目录
1. 触发器的概述
触发器可以理解成为一种特殊类型的存储过程,但它不同于存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。触发器主要是通过一定的操作(诸如Update、 Insert、 Delete 这些操作时)来触发自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
2. 触发器的使用
2.1 测试准备
创建STUDENT表和USERS表:
|
--学生表 student CREATE TABLE DMHR.STUENDT(ID INT,NAME VARCHAR(10),PHONE VARCHAR(11),CREATE_TIME DATETIME DEFAULT SYSDATE); --用户表 users CREATE TABLE DMHR.USERS(ID INT,NAME VARCHAR(10),CREATE_TIME DATETIME DEFAULT SYSDATE); |
2.2 触发器分类
触发器可以分为:表级触发器和时间出发器两种类型。
2.2.1 表级触发器
表级触发器的触发动作是三种数据操作命令,即 INSERT、DELETE 和 UPDATE 操作。
创建触发器,如下所示:
(1)行级触发器,对触发命令所影响的每一条记录都激发一次。
|
CREATE OR REPLACE TRIGGER TRG_NAME AFTER INSERT OR DELETE OR UPDATE ON TABLE_NAME FOR EACH ROW -- 行级:此子句一定不能省略 BEGIN PRINT 'INSERT OR DELETE OR UPDATE OPERATION ON TABLE_NAME';--要执行的SQL END; |
(2)语句级触发器,对每个触发命令执行一次。
|
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 触发器,该触发器在插入一条记录后,将该记录中ID、NAME的值插入到表DMHR.USERS。如下所示:
|
//进入数据库 DMHR 模式 SET SCHEMA DMHR; //创建 AFTER 触发器 CREATE OR REPLACE TRIGGER DMHR.TRG_INS_STU_AFTER AFTER INSERT ON DMHR.STUDENT FOR EACH ROW BEGIN INSERT INTO DMHR.USERS (ID,NAME) VALUES (:NEW.ID,:NEW.NAME); END; |
DMHR.USERS插入前表数据如下 :

向DMHR.STUDENT表插入一条记录后,DMHR.USERS表记录如下:

创建 BEFORE 触发器,该触发器在插入一条记录前,将记录中ID的值加 1。如下所示:
|
//进入数据库 OTHER 模式 SET SCHEMA DMHR; //创建 BEFORE 触发器 CREATE OR REPLACE TRIGGER DMHR.TRG_INS_STU_BEFORE BEFORE INSERT ON DMHR.STUDENT FOR EACH ROW BEGIN :NEW.ID:=:NEW.ID+1; END; |
插入前记录如下:

插入一条记录如下:
|
INSERT INTO DMHR.STUDENT VALUES (18,'DM18','12312323',SYSDATE); |
插入后值如下:
该条记录的ID由原来的18变成19了。

创建 INSTEAD OF 触发器,该触发器在动作触发的时候,替换原始操作,INSTEAD OF 允许建立在视图上,并且只支持行级触发。如下所示:
|
CREATE VIEW DMHR.V_STUDENT AS SELECT * FROM DMHR.STUDENT; //在视图 DMHR.V_STUDENT 上创建 INSTEAD OF 触发器。 CREATE OR REPLACE TRIGGER INS_OF_STUDENT INSTEAD OF UPDATE ON DMHR.V_STUDENT BEGIN INSERT INTO DMHR.STUDENT VALUES(21,'DM20','2020202',SYSDATE()); --替换动作 END; |
执行UPDATE更新语句如下:
|
UPDATE DMHR.V_STUDENT SET ID = 5 WHERE ID=1; |
更新后结果如下:

更新操作变成插入一条ID为20的记录了,实际上的更新操作没有做。
2.2.2 时间触发器
时间触发器属于一种特殊的事件触发器,可以定义一些有规律性执行的、定点执行的任务。
创建时间触发器,在屏幕上每隔一分钟输出一行 HELLO WORLD。如下所示:
|
CREATE OR REPLACE TRIGGER DMHR.TIMER1 AFTER TIMER on database for each 1 day for each 1 minute BEGIN print 'HELLO WORLD'; END; |
时间触发器的最低时间频率精确到分钟级,定义很灵活,完全可以实现数据库中的代理功能,只要通过定义一个相应的时间触发器即可。在触发器体中定义要做的工作,可以定义操作的包括执行一段 SQL 语句、执行数据库备份、执行重组 B 树、执行更新统计信息、执行数据迁移 (DTS)。
3. 触发器的管理
每个触发器创建成功后都自动处于允许状态 (ENABLE),当不想被触发,但是又不想删除这个触发器。这时,可将其设置关闭触发器 (DISABLE)。
3.1 开关触发器
|
//关闭触发器 ALTER TRIGGER DMHR.TRG_INS_STU_BEFORE DISABLE; //打开触发器 ALTER TRIGGER DMHR.TRG_INS_STU_BEFORE ENABLE; |
3.2 查询触发器
|
//查看当前数据库的全部触发器 SELECT * FROM DBA_TRIGGERS; //查看当前用户有权限访问的触发器 SELECT * FROM ALL_TRIGGERS; //查看示当前用户所拥有的触发器 SELECT * FROM USER_TRIGGERS; |
3.3 删除触发器
|
DROP TRIGGER DMHR.TRG_INS_STU_BEFORE; |
4. 总结
- <触发器名>是触发器的名称,它不能与模式内的其他模式级对象同名。
- 可以使用 OR REPLACE 选项来替换一个触发器,但是要注意被替换的触发器的触发表不能改变。如果要在同一模式内不同的表上重新创建一个同名的触发器,则必须先删除该触发器,然后再创建。
- INSTEAD OF 触发器仅允许建立在视图上,并且只支持行级触发。
- 表级触发器不支持跨模式,即<触发器名>必须和<触发表名>、<触发视图名>的模式名一致。
- 水平分区子表、HUGE 表不支持表级触发器。
更多达梦技术资讯,请访问达梦技术社区:
更多推荐
https://eco.dameng.com/

所有评论(0)