1. 创建一个触发器,表中的行在任何时候被插入或更新时,当前用户名和时间也会被标记在该行中。并且它会检查雇员的姓名以及薪水。

--创建测试表
CREATE TABLE emp (empname text,salary integer,last_date timestamp,last_user text
);--创建触发器函数
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$BEGIN-- 检查 empname 以及 salaryIF NEW.empname IS NULL THENRAISE EXCEPTION 'empname cannot be null';END IF;IF NEW.salary IS NULL THENRAISE EXCEPTION '% cannot have null salary', NEW.empname;END IF;-- 谁会倒贴钱为我们工作?IF NEW.salary < 0 THENRAISE EXCEPTION '% cannot have a negative salary', NEW.empname;END IF;-- 记住谁在什么时候改变了工资单NEW.last_date := current_timestamp;NEW.last_user := current_user;RETURN NEW;END;
$emp_stamp$ LANGUAGE plpgsql;--创建触发器
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON empFOR EACH ROW EXECUTE PROCEDURE emp_stamp();--测试触发器
test=# insert into emp values ('John');  --salary为空,触发器报错
ERROR:  John cannot have null salary
CONTEXT:  PL/pgSQL function emp_stamp() line 7 at RAISEtest=# insert into emp values (null,1200);   --empname为空,触发器报错
ERROR:  empname cannot be null
CONTEXT:  PL/pgSQL function emp_stamp() line 4 at RAISEtest=# insert into emp values ('John',-200); --salary为负数,触发器报错
ERROR:  John cannot have a negative salary
CONTEXT:  PL/pgSQL function emp_stamp() line 10 at RAISEtest=# insert into emp values ('Bob',1200);  --成功插入正常数据,并记录了最后操作时间和操作用户
INSERT 0 1
test=# select * from emp;empname | salary |         last_date          | last_user
---------+--------+----------------------------+-----------Bob     |   1200 | 2017-08-09 17:39:23.671957 | postgres
(1 row)

2. 用于审计的触发器过程
这个例子触发器保证了在emp表上的任何插入、更新或删除一行的动作都被记录(即审计)在emp_audit表中。当前时间和用户名以及在其上执行的操作类型都会被记录到行中。

--创建测试表
create table emp (
empname text not null,
salary integer
);--创建审计表
create table emp_audit(
operation       char(1)   not null,
stamp           timestamp not null,
userid          text      not null,
empname         text      not null,
salary          integer
);--创建触发器函数
create or replace function process_emp_audit() returns trigger as $emp_audit$
beginif (TG_OP = 'DELETE') theninsert into emp_audit select 'D',now(),user,old.*;return old;elsif (TG_OP = 'UPDATE') theninsert into emp_audit select 'U',now(),user,new.*;return new;elsif (TG_OP = 'INSERT') theninsert into emp_audit select 'I',now(),user,new.*;return new;end if;return null;
end;
$emp_audit$ language plpgsql;--创建触发器
create trigger emp_audit
after insert or update or delete on emp
for each row execute procedure process_emp_audit();--测试触发器
test=# insert into emp values ('John',1200);
INSERT 0 1
test=# select * from emp_audit;operation |           stamp            |  userid  | empname | salary
-----------+----------------------------+----------+---------+--------I         | 2017-08-09 18:18:10.189772 | postgres | John    |   1200
(1 row)

The End!

2017-08-17

【PostgreSQL-9.6.3】触发器实例相关推荐

  1. SQL触发器实例讲解1

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.        常见的触发器有三种:分别应 ...

  2. SQL触发器实例讲解

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.        常见的触发器有三种:分别应用于Insert , ...

  3. SQL中触发器实例讲解(转)

    SQL中触发器实例讲解 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.      常见的触发器有三种:分别应 ...

  4. 存储过程,游标和触发器实例

    存储过程,游标和触发器实例 原文:存储过程,游标和触发器实例 自己写的存储过程与游标结合使用的实例,与大家分享,也供自己查阅,仅供参考: --使用游标循环处理,删除重复的记录declare @User ...

  5. 触发器实例精讲-志在必得

    SQL触发器实例精讲,必看必会 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.        常见的触发器有 ...

  6. Oracle Tigger触发器 实例

    Oracle Tigger触发器 实例 --实例1------------------------ --创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表 --创建测试表 CREA ...

  7. SQL触发器实例讲解(本文是来自百度文库)

    我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分享下给大家. 定义: 何为触发器?在SQL Server里面也就是对某一 ...

  8. SQL触发器实例讲解(转)

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , ...

  9. SQL触发器实例(下)

    1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发 ...

  10. sqlserver 触发器实例代码

    何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , D ...

最新文章

  1. 一些达成共识的JavaScript编码风格约定
  2. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
  3. pandas apply()函数参数 args
  4. python socket编程:实现redirect函数、cookie和session
  5. 【源码分享】POSCMS功能如何实现短信验证码
  6. java实现无序数组结构
  7. public static void main(String[] args)的理解
  8. 从mysql取出数据封装成json中遇到特殊字符自动转成unicode解决方案
  9. 改善深层神经网络:超参数调整、正则化以及优化——2.6 动量梯度下降法
  10. spring data elasticsearch 对应 elasticsearch 版本
  11. Atcoder 077E - guruguru(线段树+dp)
  12. 从一个实例(整数幂指数)进行算法时间复杂度的分析
  13. 再谈关于IP数据报分片
  14. 科大讯飞语音合成python版
  15. 【Ansible】非完全离线安装Ansible和Ansible-tower
  16. 移动端html富文本编辑器,PC/移动端的富文本编辑器wangEditor的使用
  17. 使用Python实现电子词典
  18. AppStore上架过程记录(四)--完结
  19. CFileDialog 和 CFileDialog构造函数
  20. oracle数据库拼接sql语句字符串问题

热门文章

  1. win7日历加入农历_还是农历更亲切,春节制作一个带农历的日历,欢欢喜喜过新年...
  2. 电脑可以开机但是黑屏_铅锤哥:十五种电脑开机黑屏的原因与解决思路
  3. python学习:Python 包
  4. Java Android几个重要的基础知识
  5. 【Java编程思想笔记】-集合1
  6. 《Python数据分析实战》day2: Pandas中取得某行或者是某列的一点思考
  7. Golang通过syscall调用windows dll方法
  8. 给商品评分效果,CSS技巧
  9. Lucene开发(一):快速入门
  10. pthread库进行多线程编程 - 组件工厂 - C++博客