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;
【注】:禁用后的触发器仍然存在于数据库中,只是不触发事件而已。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342