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();	-- 触发函数
posted @ 2026-01-05 16:28  大胖熊哈  阅读(2)  评论(0)    收藏  举报