PostgreSQL 触发器

PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。

下面是关于 PostgreSQL 触发器几个比较重要的点:

PostgreSQL 触发器可以在下面几种情况下触发:

在执行操作之前(在检查约束并尝试插入、更新或删除之前)。

在执行操作之后(在检查约束并插入、更新或删除完成之后)。

更新操作(在对一个视图进行插入、更新、删除时)。

触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。

WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。

如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。

BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。

当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。

语法

创建触发器时的基础语法如下:

CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name

ON table_name

[

-- 触发器逻辑....

];

在这里,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 数据库操作。您可以在表名后选择指定 FOR EACH ROW。

以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器的语法:

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name

ON table_name

[

-- 触发器逻辑....

];

实例

让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:

runoobdb=# CREATE TABLE COMPANY(

ID INT PRIMARY KEY NOT NULL,

NAME TEXT NOT NULL,

AGE INT NOT NULL,

ADDRESS CHAR(50),

SALARY REAL

);

为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中:

runoobdb=# CREATE TABLE AUDIT(

EMP_ID INT NOT NULL,

ENTRY_DATE TEXT NOT NULL

);

在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示:

runoobdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

auditlogfunc() 是 PostgreSQL 一个程序,其定义如下:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$

BEGIN

INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);

RETURN NEW;

END;

$example_table$ LANGUAGE plpgsql;

现在,我们开始往 COMPANY 表中插入数据:

runoobdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 );

这时,COMPANY 表中插入了一条记录:

同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:

emp_id | entry_date

--------+-------------------------------

1 | 2013-05-05 15:49:59.968+05:30

(1 row)

列出触发器

你可以把从 pg_trigger 表中把当前数据库所有触发器列举出来:

runoobdb=# SELECT * FROM pg_trigger;

如果,你想列举出特定表的触发器,语法如下:

runoobdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

得到结果如下:

tgname

-----------------

example_trigger

(1 row)

删除触发器

删除触发器基础语法如下:

drop trigger ${trigger_name} on ${table_of_trigger_dependent};

删除本文上表 company 上的触发器 example_trigger 的指令为:

drop trigger example_trigger on company;

oracle触发器 菜鸟教程,PostgreSQL 触发器相关推荐

  1. PostgreSQL触发器的使用

    原文: https://www.yiibai.com/postgresql/postgresql-trigger.html -------------------------------------- ...

  2. oracle触发器高级教程

    [转自]http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153503 CREA ...

  3. 触发器使用教程和命名规范

    触发器使用教程和命名规范 目  录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三 ...

  4. ORACLE查出表所有的触发器及触发器详细信息

    ORACLE查出表所有的触发器及触发器详细信息 一.查all_triggers表得到trigger_name Sql代码 select trigger_name from all_triggers w ...

  5. oracle触发器函数,oracle 存储过程、函数和触发器用法实例详解

    本文实例讲述了oracle 存储过程.函数和触发器用法.分享给大家供大家参考,具体如下: 一.存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 创建存储过程 用CR ...

  6. postgreSQL触发器

    一.概述 1.什么是触发器 触发器的功能就是为了解决这类问题而设计的,当你更新或查询某个资料表时会触动触发器,触发器就会照您所设计的流程,同步去插入.更新.删除其他资料,你不再需要重复下达多次的SQL ...

  7. Oracle/Kingbase中用序列和触发器实现ID自增

    在设计数据库的时候,Oracle中没有类似SQL Server中系统自动分配ID作为主键的功能,这时Oracle可以通过"序列"和"触发器"来实现ID自动增加的 ...

  8. 【Oracle】常用对象之触发器

    一.什么是触发器? 触发器trigger,是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用,有行级触发器和语句级触发器之分. 行级触发器:触发的表中的每一条数据改变时就会 ...

  9. Oracle数据库基础教程

    查看书籍详细信息: Oracle数据库基础教程 编辑推荐 体现作者多年的数据库管理与开发经验,结合大量实用技巧,重点突出,便于灵活掌握,提供典型应用实例与上机实验,分析详细,实用性强. 本书是作者结合 ...

  10. mysql触发器实验小结_mysql 触发器小结

    触发器可以监视某种数据操作(insert/update/delete) 并触发(insert/update/delete)( 创建触发器4要素 监视地点 -----监视事件----触发时间----触发 ...

最新文章

  1. vss2005与vs2005绑定问题解决
  2. CF1070L Odd Federalization 高斯消元
  3. ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
  4. dubbo官方文档_狂神说SpringBoot17:Dubbo和Zookeeper集成
  5. WEB打印控件Lodop技术手册
  6. 周记20180309
  7. 分类器集成和非均衡分类
  8. 模拟信号的调制与解调
  9. panda3d python教程_图解 Panda3D引擎开发入门
  10. WEB2.0下的金蛋 什么样的商业模式会成功?
  11. 解决:steps/make_fbank.sh: line 132: run.pl: command not found
  12. 翻斗式雨量计的组成与工作原理
  13. js实现查找两个相同字符串之间的最长子字符串长度
  14. Windows server 2012 服务器挂载NAS盘
  15. mysql 除法和四舍五入
  16. 这样做老板,企业才发展!
  17. Unity ILRuntime Debugger使用及常见问题
  18. Linux下使用yay搜索软件出错
  19. vuejs视图不能及时更新的问题 ,深入响应式原理
  20. 基准价搭档“货比三家” 8thManage轻松节省采购成本

热门文章

  1. C语言课程设计–成绩管理系统
  2. python无限锁屏_定时锁屏程序,Python祝你原理猝死!
  3. sql prompt linux,SQL PROMPT的设置
  4. three.js视频教程2022最新
  5. python集合和字典创建通讯录_Python基础-字典和集合
  6. VC与VS的对应关系
  7. wps 打开xml格式乱码_“WPS不兼容EXCEL打开后出现乱码怎么解决“xlsx文件打开是乱码怎么办...
  8. xlsx文件打开乱码_我的 EXCEL 工作表打开出现乱码?(xlsx文件打开是乱码怎么办)...
  9. 01-hadoop学习环境准备
  10. K2P 潘多拉固件PandoraBox