05-PGTrigger
PGTrigger
PLPGSQL
PLPGSQL是一種过程化的语言,类似c,可以定义变量,执行函数。
基本的格式类似下文:
create function test() -- 建立名為 test 的函數
returns int -- 回傳整數類型
as
$$ -- 函數主體開始
declare -- 宣告區塊開始
money int := 10; -- 宣告一個整數變數 money,初始值為 10
begin -- 執行區塊開始
return money; -- 回傳 money 變數的值
end; -- 執行區塊結束
$$ -- 函數主體結束
language plpgsql; -- 使用 PL/pgSQL 語言
触发器
上面之所以使用plpgsql,是因为要结合我们的过程函数,实现自动触发对应的逻辑。
事件->触发器->触发器函数
下面实现一个删除学生信息->自动删除分数的触发器。
构建一个触发器函数
create function trigger_function_delete_student_score()
returns trigger -- 返回值要设置为trigger
as $$
begin
delete from score where student_id = old.id;
return old;
end;
$$ language plpgsql;
当一个PL/pgSQL函数当做触发器调用时,在顶层块会自动创建一些特殊变量。它们是:
NEW
数据类型是RECORD;该变量为行级触发器中的INSERT/UPDATE操作保持新数据行。在语句级别的触发器以及DELETE操作,这个变量是null。
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;是导致触发器调用的表的对象 ID。
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)会导致返回一个空值。
我们常用的是old/new,其中old表示操作之前的数值,new表示被操作之后的新值。
构建触发器
编写触发器的语法格式如何,使用\help create trigger可以查询。
简而言之,我们需要给出名称,触发的事件,触发的次数,触发的函数.
CREATE [ OR REPLACE ] [ 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 )
where event can be one of:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
一个删除学生信息的触发器例子如下:
create trigger trigger_student -- 触发器名称
after delete or truncate -- 触发条件
on student -- 触发的表
for each row -- 执行次数
execute function trigger_function_delete_student_score(); -- 触发函数

浙公网安备 33010602011771号