postgresql之触发器

一,前人总结
1.触发器在指定的数据库事件发生时调用
2.语法
create trigger trigger_name
{before(在执行操作之前触发)|after(在执行操作之后触发)|instead(更新操作 视图)}
{event(insert,update,delete,truncate)}
on table_name
{for each row(对指定操作的每一行调用一次)|for each statement (只会为任何指定的操作执行一次,不管修改多少行)}
execute procedure (触发的函数)
在这里插入图片描述
二,语句
1 创建触发器
语法见 一,2
2 触发器函数
在创建触发器之前,首先要创建一个触发器函数,它是指一个没有参数并且返回tigger类型的函数
在这里插入图片描述

3 查看触发器
select * from pg_trigger;
查看特定表的触发器
select tgname from pg_trigger,pg_class where tgrelid=pg_class.oid and relname=’company’;
4删除触发器
drop trigger example_trigger on company;
5启用/禁用触发器
a.启用或禁用所有触发器
启用
select fn_triggerall(true)
禁用
select fn_triggerall(false)
b.启用或禁用当前会话的触发器
禁用
SET session_replication_role = replica;
启用
SET session_replication_role = DEFAULT;
c.启用或禁用某个表的某个触发器
启用
ALTER TABLE table_name DISABLE TRIGGER trigger_name;
禁用
ALTER TABLE table_name ENABLE TRIGGER trigger_name
6总结
在一个表上创建一个触发器,触发器就定义了事件发生时会触发的事情(比如执行一个函数)
无非是有一个触发器函数会用到一个触发之后写入的表,再一个触发器创建语句
然后在目标表上创建了触发器之后,当对目标表进行一定的操作时,就会触发触发器函数,触发器函数就会对触发器那个表进行操作
7 查询触发器

select nspname as schema名称,relname as 表名,tgname as 触发器名称,t4.proname as 触发器函数,'dml_red,dml_err_log' as 中间表
from pg_trigger t1,pg_class t2,pg_namespace t3,pg_proc t4
where t1.tgrelid=t2.oid and t2.relnamespace=t3.oid and t1.tgfoid=t4.oid
and tgname like 'tri_%_log'  and tgenabled!='D' order by nspname;

目标表(要创建触发器的表)
触发器函数(一旦对目标表发生更改或者数据库事件则执行该函数,该函数定义内容是插入数据到审计表)
审计表:如果目标表发生某个事件,这个表就会插入一条数据.
这三者的关系就像两个箱子一个机器.

把事件发生之后触发器被调用,则会自动创建一些特殊变量,把这些变量按照需求写入到审计表里边去

注:本文仅供自己学习,如有侵权,请私信

### 如何在 PostgreSQL 中创建触发器 #### 基本概念 PostgreSQL 提供了两种类型的触发器:表级触发器和事件触发器。表级触发器通常用于响应 `INSERT`、`UPDATE` 或 `DELETE` 操作,而事件触发器则针对特定的 DDL 事件。 --- #### 表级触发器的创建语法 以下是创建表级触发器的标准语法: ```sql CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event } ON table_name [ FOR [ EACH ] { ROW | STATEMENT } ] EXECUTE FUNCTION function_name(); ``` - **trigger_name**: 触发器名称。 - **BEFORE/AFTER/INSTEAD OF**: 定义触发器执行的时间点。 - **event**: 可以为 `INSERT`, `UPDATE`, `DELETE` 或其组合。 - **table_name**: 被监控的表名。 - **FOR EACH ROW/STATEMENT**: 指定触发器是在每一行上还是整个语句结束后执行。 - **function_name**: 触发器关联的函数名称。 示例: 假设我们希望在向 `teaches` 表插入新记录之前验证某些条件,则可以定义如下触发器[^1]: ```sql CREATE OR REPLACE FUNCTION example_function() RETURNS TRIGGER AS $$ BEGIN -- 这里可以编写逻辑来处理 NEW 数据 RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER example_trigger BEFORE INSERT ON teaches FOR EACH ROW EXECUTE FUNCTION example_function(); ``` 在此上下文中,`NEW` 是一个特殊的关键字,表示即将插入的新行数据[^2]。 --- #### 事件触发器的创建语法 对于更高级的需求,如拦截或记录 DDL 操作,可以使用事件触发器。以下是其标准语法: ```sql CREATE EVENT TRIGGER trigger_name ON { ddl_command_start | ddl_command_end | sql_drop } [ WHEN condition_elements ] EXECUTE FUNCTION function_name(); ``` - **trigger_name**: 触发器名称。 - **ON**: 指定监听的事件类型 (`ddl_command_start`, `ddl_command_end`, 或 `sql_drop`)。 - **condition_elements**: (可选)进一步过滤满足条件的操作。 - **function_name**: 关联的触发器函数。 示例: 如果需要阻止任何用户删除数据库中的视图,可以设置以下事件触发器[^5]: ```sql CREATE OR REPLACE FUNCTION prevent_view_drops() RETURNS event_trigger AS $$ DECLARE obj record; BEGIN FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() LOOP IF obj.object_type = 'view' THEN RAISE EXCEPTION 'Dropping views is not allowed!'; END IF; END LOOP; END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER no_view_drops ON sql_drop EXECUTE FUNCTION prevent_view_drops(); ``` 此代码通过捕获 `sql_drop` 事件并检查目标对象是否为视图,在必要时抛出异常以防止操作完成。 --- #### 使用场景总结 PostgreSQL触发器功能广泛应用于多种实际需求中,包括但不限于以下方面[^3]: - 输入数据的有效性校验。 - 实现复杂的业务规则。 - 自动生成唯一标识符或其他派生字段。 - 记录变更日志以便后续审计。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值