KingbaseES触发器介绍
-
触发器及其作用
触发器(trigger)是用户定义的由事件驱动的特殊过程。一旦定义,所有用户的对应操作均会由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。
触发器类似于约束,但是比约束更加灵活,也可以实施比外键约束、检查约束更为复杂的检查和操作,具有更精细和更强大的数据处理能力。 -
触发器分类
KingbaseES的触发器根据依赖触发对象的不同分为两种表级触发器和事件触发器:
a. 表级触发器:依赖于已存在的表,对特定表的相关操作会引动发触发器调用相应的触发器函数。
b. 事件触发器:依赖于特定的事件。事件触发器对数据库来说是全局的,并且可以捕捉DDL事件。 -
查看触发器
select * from information_schema.triggers
-
创建触发器
-
语法
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FROM referenced_table_name ]
[ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
[ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )
CREATE TRIGGER创建一个新触发器。该触发器将被关联到指定的表、视图或者外部表并且在表上发生特定操作时将执行指定的函数function_name。
为了创建一个触发器,必须首先创建一个返回类型为trigger 或event_trigger 的触发器函数。
-
触发器函数
当一个函数被声明为一个没有参数且返回值类型为trigger(作用于表级触发器)或者 event_trigger(作用于事件触发器)的函数时,这个函数就是一个触发器函数。
触发器函数只能通过触发器调用,而不能直接调用。 -
例子 记录emp表操作信息
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
END IF;
RETURN NULL;
END;
$emp_audit$ LANGUAGE plsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE FUNCTION process_emp_audit();
-
触发器函数中的特殊变量
NEW | :NEW 数据类型为RECORD;该变量为行级触发器中的INSERT /UPDATE 操作保持新数据行。在语句级别的触发器以及DELETE 操作,这个变量是null。
OLD | :OLD 数据类型为“RECORD“;该变量为行级触发器中的UPDATE/DELETE 操作保持新数据行。在语句级别的触发器以及INSERT 操作,这个变量是null。
TG_NAME 数据类型为NAME;实际触发的触发器名。
TG_WHEN 数据类型为TEXT;触发器触发的时机,包括BEFORE、AFTER 或INSTEAD OF,具体取决于触发器的定义。
TG_LEVEL 数据类型为TEXT;触发器的级别,为ROW 或“STATEMENT“,具体取决于触发器的定义。
TG_OP 数据类型为TEXT;触发触发器的操作,包括“INSERT“、UPDATE、DELETE 或TRUNCATE。
TG_RELID 数据类型为OID;触发触发器的对象的OID。
TG_RELNAME 数据类型为NAME;触发触发器的表(视图)的名称,这个变量可能在未来的版本中被取消,所以现在应尽量使用TG_TABLE_NAME 来替代它。
TG_TABLE_NAME 数据类型为NAME;触发触发器的表(视图)的名称。
TG_TABLE_SCHEMA 数据类型为NAME;触发触发器的表(视图)所在的模式名。
TG_NARGS 数据类型为INTEGER;在CREATE TRIGGER 语句中传递给触发器函数的参数数量。
TG_ARGV[] 数据类型为TEXT 数组;CREATE TRIGGER 语句中传递给触发器函数的参数。下标从0 开始。非法下标(小于0 或者大于等于TG_NARGS)会返回一个空值。 -
删除触发器
DROP TRIGGER [ IF EXISTS ] NAME ON TABLE [ CASCADE | RESTRICT ];
删除触发器时,触发器的函数不会被删除。不过,当表删除时,表上的触发器也会被删除,可以使用 DROP FUNCTION fun_name 直接删除触发器函数。