关键字:
KingbaseES、触发器、DML触发器
1.触发器概述
在一些场景下,为了保证数据的完整性和和一致性,以及一些强制约束, PL/SQL引入了触发器,它其实是一种特殊的存储过程,定义了一些在数据库相关事件发生时所应执行的功能代码,如:INSERT、UPDATE等事件。根据触发事件和所针对的数据库操作类型的不同,可以将触发器分为如下几类:
- DML(Data Definition Language, DML)触发器:在表或视图上创建的触发器,触发事件由DML语句组成,这类触发器是用户自定义的触发器。
- 系统触发器:在模式或数据库上创建的触发器,触发事件由DDL或数据库操作语句组成,用户通常无需对这些触发器进行管理。
2.DML触发器
对于触发事件由DML语句DELETE、INSERT 和 UPDATE 组成的触发器,称之为DML触发器。如果需要创建一个由MERGE语句触发的触发器,可以将MERGE操作分解到INSERT 和 UPDATE 语句上来创建触发器。一个简单的DML触发器,它可以在以下任意时间点被触发:
BEFORE:在触发语句运行之前。
AFTER:在触发语句运行之后。
BEFORE EACH ROW:在触发语句影响的每一行之前。
AFTER EACH ROW:在触发语句影响的每一行之后。
可以通过FOR EACH ROW来创建一个行级触发器,示例如下:
CREATE OR REPLACE TRIGGER tri BEFORE INSERT ON goods FOR EACH ROW
BEGIN
--根据用户需求设置执行代码;
END;
/
检测触发DML语句的条件谓词:
一个DML触发器的触发事件可以由一个或多个触发语句组成,当该触发器的触发语句不止一个时,可以通过使用条件谓词对触发语句进行确定。
条件谓词 | 条件 |
---|---|
INSERTING | 触发器由一个INSERT语句触发 |
UPDATING | 触发器由一个UPDATE语句触发 |
UPDATING(’column’) | 触发器由指定列的 UPDATE 语句触发 |
DELETING | 触发器由一个DELETE语句触发 |
其中,条件谓词可以出现在BOOLEAN表达式可以出现的任地方。
一个DML触发器的示例如下,该触发器使用条件谓词来确定触发它的触发语句:
--创建一个studet表,包含学生id、姓名和成绩
DROP TABLE IF EXISTS student;
CREATE TABLE student (sid int, name text, score number, PRIMARY KEY(sid));
insert into student values (1, 'zs', 65);
insert into student values (2, 'ls', 86);
insert into student values (3, 'ww', 73);
--创建一个DML触发器,触发语句包括INSERT、UPDATE和 DELETE
\set SQLTERM /
CREATE OR REPLACE TRIGGER tr1
BEFORE
INSERT OR UPDATE OF score, sid OR DELETE
ON student
BEGIN
CASE
WHEN INSERTING THEN
RAISE NOTICE 'The trigger statement is inserting';
WHEN UPDATING('score') THEN
RAISE NOTICE 'The trigger statement is updating score';
WHEN UPDATING('sid') THEN
RAISE NOTICE 'The trigger statement is updating department SID';
WHEN DELETING THEN
RAISE NOTICE 'The trigger statement is deleting';
END CASE;
END;
/
--在匿名块中通过INSERT、UPDATE、DELETE语句触发tr1触发器
BEGIN
INSERT INTO student values(4,'wh',79); --insert
UPDATE student set score=76 WHERE sid=1; --updating
DELETE FROM student WHERE sid=4; --deleting
END;
/
结果如下:
NOTICE: The trigger statement is inserting
NOTICE: The trigger statement is updating score
NOTICE: The trigger statement is deleting
3.触发器触发的顺序
如果在同一张表上的同一语句中定义了两个及以上具有不同时间点的触发器,它们将按照以下顺序触发:
BEFORE STATEMENT 触发器
BEFORE EACH ROW 触发器
AFTER EACH ROW 触发器
AFTER STATEMENT 触发器
4.触发器的启用和禁用
为了适应用户的不同需求,在PL/SQL 中提供了启用和禁用触发器的功能。当触发器被启用时,当与其关联的触发事件发生时,触发器就会自动执行或触发,当触发器被禁用后,触发器将不会被触发。通常在出现以下情况时,我们可以暂时禁用触发器:
- 触发器引用了一个不可用的对象;
- 用户必须进行大量的数据加载,需要快速进行;
- 用户正在重新加载数据。
在禁用状态下创建触发器的好处在于可以确保它在启用之前编译没有错误。
使用以下语句,启用或禁用单个触发器,其中,schema是包含触发器的模式的名称。
ALTER TRIGGER [schema.]trigger_name { ENABLE | DISABLE };
使用以下语句,启用或禁用在特定表上创建的所有版本中的所有触发器:
ALTER TABLE table_name { ENABLE | DISABLE } ALL TRIGGERS;
更多信息,参见https://help.kingbase.com.cn/v8/index.html