关键字:
KingbaseES、TRIGGER、人大金仓
什么是触发器?
触发器(TRIGGER)是一个命名的 PL/SQL 单元,它存储在数据库中并且可以重复调用,可以启用和禁用触发器,但不能显式调用它。当触发器被启用时,只要它的触发事件发生,数据库会自动调用触发器,当触发器被禁用时,则不会被触发。
触发器是在表、视图、模式或数据库上创建的,可以指定触发器被触发的时间点,确定触发器是在触发语句运行之前还是之后触发,以及是否针对触发语句影响的每一行触发,触发器创建完成后,默认是启用状态。
触发器的作用以及分类
触发器的分类:
- 如果触发器是在表或视图上创建的,则触发事件由 DML 语句组成,触发器称为DML 触发器。
- 如果触发器是在模式或数据库上创建的,那么触发事件由 DDL 或数据库操作语句组成,触发器称为系统触发器。
触发器的作用:
- 自动生成虚拟列值
- 记录事件
- 收集有关表访问的统计信息
- 在针对视图发出 DML 语句时修改表数
- 将有关数据库事件、用户事件和 SQL 语句的信息发布到订阅应用程序
- 防止在正常工作时间后对表进行 DML 操作
- 防止无效交易
- 强制执行无法使用约束定义的复杂业务或参照完整性规则
触发器的创建
使用CREATE TRIGGER关键字创建触发器:
CREATE TRIGGER <触发器名>
| BEFORE | AFTER| <触发事件> ON <表名>
FOR EACH | ROW| STARTMENT|
{WHEN <触发条件>}
<触发的事件>
- 触发器名 – 可以包含模式,也可以不包含模式,同一个模式下触发器名必须是唯一的;并且触发器名和表名必须在同一个模式下。
- 表名 – 表内数据发生变化时,激活在该表上的相应的触发器。
- 触发事件 – 可以是INSERT、DELETE、UPDATE,也可以是几种事件的组合。
- 触发器类型 – 行级触发器(for each row),语句级触发器(for each startment)
- 触发条件 – 被激活时,触发器执行,在没有when的情况下触发器被触发动作激活后立即执行。
- 触发的事件 – 可以是一个匿名块,也可以是对已创建的存储过程的调用。
触发器的简单实用
触发器使用条件谓词检测触发语句
示例:
- 创建一个student表然后向里面插入一些数据。在该student表上创建触发器,当插入、更新、删除表中数据时都会触发触发器,打印相应动作下需要打印的内容。
- 执行结果:
对表进行更新操作时:
对表进行插入操作时:
对表进行删除操作时:
INSTEAD OF 触发器
示例:
- 建视图stu_info以显示有关学生的信息。视图本质上不是可更新的。该示例创建一个INSTEAD OF触发器来处理INSERT指向视图的语句。触发器将行插入到视图的基表student中。
- 查询student表中是否有id为555的数据
查询结果显示不存在。
- 然后使用insert语句向创建的视图中插入该数据:
结果打印了Inserting字符串,说明触发了上面在(1)中创建的触发器,
同时显示插入成功。
- 再次查询student表中是否有id为555的数据:
结果显示有一条。
- 说明该动作出发了上面创建的stu_info_insert触发器,从而将该行插入到视图的基表student中。