PostgreSQL触发器

触发器介绍

触发器介绍:
PostgreSQL触发器是每当发生与表相关的事件时自动调用的函数。事件可以是以下任何一种:insert,update,delete 或 
truncate。

触发器是绑定到表的特殊的用户自定义函数。要创建新的触发器,您必须首先定义一个触发器函数,然后将此触发器函数绑定到
一个表。
触发器和用户自定义函数的不同之处在于触发事件发生时会自动调用。
PostgreSQL 提供了两种主要类型的触发器:行级触发器和语句级触发器。两者之间的差异是触发器被调用的次数以及时机。
例如:如果发出影响20行的UPDATE语句,则行级触发器将被调用20次,而语句级触发器将被调用1次。
可以指定触发器是在事件之前还是之后调用。如果在事件之前调用触发器,则可以跳过当前行的操作,甚至可以更改正在更新或
插入的行。如果在事件之后调用触发器,则所有更改都可用于触发器。
可以使用触发器来维护复杂的数据完整性规则,除了在数据库级别之外,您无法在其他位置实施这些规则。例如,在客户表中添
加新行时,还必须在银行和贷项表中创建其他行。
使用触发器的主要缺点是,您必须知道触发器的存在并理解其逻辑,以便在数据更改时找出影响。

PostgreSQL 实现了 SQL 标准,同时 PostgreSQL 中的触发器还具有如下的特定功能:
PostgreSQL 触发 TRUNCATE 事件
PostgreSQL 允许你在视图上定义语句级触发器
PostgreSQL 要求你定义一个用户自定义函数作为触发器的动作,而 SQL 标准允许你使用任意数量的 SQL 命令

创建触发器

创建触发器:
要创建一个触发器,你需要:
(1)、使用 create function 语句创建一个触发器函数
(2)、使用 create trigger 语句将触发器函数绑定到数据表

(3)、创建触发器函数语法:
触发器函数与普通函数类似,不同之处在于触发器不需要任何参数,并且触发器函数需要返回trigger类型值
create function trigger_function()
returns trigger as $$
begin
    
    sqlstatement;
    return new;
    
end;$$
language plpgsql;

触发器函数通过一个称为 TriggerData 的特殊结构接收关于其调用环境的数据,其中包含一组局部变量。
如:old 和 new 表示触发事件之前或之后表中的行的状态。PostgreSQL 提供了其他以 TG_ 作为前缀的局部变量:TG_WHEN, 
TG_TABLE_NAME 等。


(4)、创建触发器语法(如下简单语法):
create trigger trigger_name
    {before | after | instead of} event1 or event2...
    on table_name
    {for each row | for each statement}
    execute procedure trigger_function;

event1: 事件可以是:insert, update, delete, truncate
before: 表示定义触发器在事件之前
after:   表示定义触发器在事件之后
intead of:   表示仅用于视图的insert, update, delete
for each row:表示行级触发器
for each statement:表示语级触发器




案例:
create table employee(
    id serial primary key,
    first_name varchar(50),
    last_name varchar(50)
);

create table employee_audits(
    id serial primary key,
    employee_id integer,
    first_name varchar(50),
    last_name varchar(50),
    change_time timestamp
);

insert into employee(first_name,last_name)values
    ('Jerry','Tom'),
    ('Hunk','Bone');
    
select * from employee;


创建触发器函数:
create or replace function log_last_name_changes()
returns trigger as $$
begin
    if new.last_name <> old.last_name then
        insert into employee_audits(employee_id,first_name,last_name,change_time) 
          values
            (old.id,old.first_name,old.last_name,now());
        
    end if;
    return new;
    
end; $$
language plpgsql;


创建触发器绑定到表:
create trigger last_name_changes 
    before update on employee  --定义触发器在事件update之前
    for each row 
    execute procedure log_last_name_changes();


select * from employee_audits;
update employee set last_name='Who' where id=2;
select * from employee_audits;
结果:
id    employee_id  first_name  last_name  change_time
1     2            Hunk        Bone       2020-04-29 22:38:15.890435

管理触发器

删除触发器:
drop trigger [if exists] trigger_name on table_name [cascade | restrict];
[cascade:级联删除触发器;restrict:被引用时禁止删除]


修改触发器:
alter trigger trigger_name on table_name rename to new_name;


禁用触发器:
禁用该表上的一个触发器
alter table table_name disable trigger trigger_name;

禁用该表上的所有触发器
alter table table_name disable trigger all;
【注】:禁用后的触发器仍然存在于数据库中,只是不触发事件而已。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。