概述
文章目录
触发器是对应用动作的响应机制,当应用对一个对象发起DML操作时,就会产生一个触发事件(Event)。如果该对象上拥有该事件对应的触发器,那么就会检查触发器的触发条件(Condition)是否满足,如果满足触发条件,那么就会执行触发动作(Action)。
通过
CREATE TRIGGER
命令可以创建一个触发器,在CREATE TRIGGER
命令中可以指定触发器的事件、条件和动作。
例2-58:创建触发器。
CREATE TRIGGER <trigger name> # 触发器名称
<trigger action time><trigger event> # 触发器事件
ON <table name> # 触发器对象
[REFERENCING <old or new values alias list>] # 触发器条件
<triggered action> # 触发器动作
当满足触发事件时,还需要考虑触发器的执行时机,触发器语法提供了两个触发时机:
BEFORE
:在触发器事件执行之前检查触发条件以及执行触发动作;AFTER
:触发事件之后检查触发条件以及执行触发动作。
例2-59:在UPDATE事件发生之前执行触发器。具体语句如下:
CREATE TRIGGER before_update
BEFORE UPDATE
ON ......
例2-60:在INSERT事件发生之后执行触发器。具体语句如下:
CREATE TRIGGER after_insert
AFTER INSERT
ON ......
触发器可以对应到元组(一个SQL语句可以更新多个元组),也可以对应到SQL语句级,默认是SQL语句级。
例2-61:针对SQL语句级的触发器。具体语句如下:
CREATE TRIGGER after_insert
AFTER INSERT
ON warehouse
FOR EACH STATEMENT
......
例2-62:针对元组级的触发器。具体语句如下:
CREATE TRIGGER after_insert
AFTER INSERT
ON warehouse
FOR EACH ROW
......
针对触发对象的触发事件一旦发生,就会激活触发器。触发器首先检查触发条件,满足条件的情况下被执行。
元组触发器可以将更新前后的值嵌入到触发器的触发条件里。
例2-63:触发条件中包含NEW元组对应的列值。具体语句如下:
CREATE TRIGGER after_insert
AFTER INSERT
ON warehouse
FOR EACH ROW
WHEN (NEW.w_id > 10)
......
触发器的动作主要是执行一个函数。
在创建触发器之前,需要创建一个函数,如果返回值是Trigger
,那么该函数就是触发器函数,否则是普通函数。
同一个触发器可以指定多个触发事件,每个事件发生时都能激活触发器来执行触发器的动作。
例2-64:在warehouse表上创建一个完整的触发器,触发器的工作是在wh_log表中记录DELETE/UPDATE/INSERT操作的具体信息。实现的语句如下:
CREATE TABLE wh_log
(
event VARCHAR(10),
time_stamp TIMESTAMP,
w_id SMALLINT,
w_name VARCHAR(10)
);
CREATE FUNCTION record_warehouse_log()
RETURN TRIGGER AS $warehouse_log$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO wh_log SELECT 'D', now(), OLD.w_id, OLD.w_name;
RETURN OLD;
ELSEIF (TG_OP = 'UPDATE') THEN
INSERT INTO wh_log SELECT 'U', now(), OLD.w_id, OLD.w_name;
RETURN NEW;
ELSEIF (TG_OP = 'INSERT') THEN
INSERT INTO wh_log SELECT 'I', now(), OLD.w_id, OLD.w_name;
RETURN NEW;
END IF;
RETURN NULL;
END;
$warehouse_log$ LANGUAGE plpgsql;
CREATE TRIGGER warehouse_log
AFTER INSERT OR UPDATE OR DELETE ON warehouse
FOR EACH ROW
EXECUTE PROCEDURE record_warehouse_log();
如果需要删除触发器,可以使用SQL中的DROP TIGGER
命令。
例2-65:删除触发器。具体语句如下:
DROP TRIGGER warehouse_log;
最后
以上就是风趣洋葱为你收集整理的【openGauss笔记】触发器的全部内容,希望文章能够帮你解决【openGauss笔记】触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复