【PostgreSQL-9.6.3】触发器实例
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】触发器实例相关推荐
- SQL触发器实例讲解1
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应 ...
- SQL触发器实例讲解
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , ...
- SQL中触发器实例讲解(转)
SQL中触发器实例讲解 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应 ...
- 存储过程,游标和触发器实例
存储过程,游标和触发器实例 原文:存储过程,游标和触发器实例 自己写的存储过程与游标结合使用的实例,与大家分享,也供自己查阅,仅供参考: --使用游标循环处理,删除重复的记录declare @User ...
- 触发器实例精讲-志在必得
SQL触发器实例精讲,必看必会 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有 ...
- Oracle Tigger触发器 实例
Oracle Tigger触发器 实例 --实例1------------------------ --创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表 --创建测试表 CREA ...
- SQL触发器实例讲解(本文是来自百度文库)
我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分享下给大家. 定义: 何为触发器?在SQL Server里面也就是对某一 ...
- SQL触发器实例讲解(转)
定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , ...
- SQL触发器实例(下)
1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发 ...
- sqlserver 触发器实例代码
何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , D ...
最新文章
- 一些达成共识的JavaScript编码风格约定
- python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
- pandas apply()函数参数 args
- python socket编程:实现redirect函数、cookie和session
- 【源码分享】POSCMS功能如何实现短信验证码
- java实现无序数组结构
- public static void main(String[] args)的理解
- 从mysql取出数据封装成json中遇到特殊字符自动转成unicode解决方案
- 改善深层神经网络:超参数调整、正则化以及优化——2.6 动量梯度下降法
- spring data elasticsearch 对应 elasticsearch 版本
- Atcoder 077E - guruguru(线段树+dp)
- 从一个实例(整数幂指数)进行算法时间复杂度的分析
- 再谈关于IP数据报分片
- 科大讯飞语音合成python版
- 【Ansible】非完全离线安装Ansible和Ansible-tower
- 移动端html富文本编辑器,PC/移动端的富文本编辑器wangEditor的使用
- 使用Python实现电子词典
- AppStore上架过程记录(四)--完结
- CFileDialog 和 CFileDialog构造函数
- oracle数据库拼接sql语句字符串问题
热门文章
- win7日历加入农历_还是农历更亲切,春节制作一个带农历的日历,欢欢喜喜过新年...
- 电脑可以开机但是黑屏_铅锤哥:十五种电脑开机黑屏的原因与解决思路
- python学习:Python 包
- Java Android几个重要的基础知识
- 【Java编程思想笔记】-集合1
- 《Python数据分析实战》day2: Pandas中取得某行或者是某列的一点思考
- Golang通过syscall调用windows dll方法
- 给商品评分效果,CSS技巧
- Lucene开发(一):快速入门
- pthread库进行多线程编程 - 组件工厂 - C++博客