免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4431 | 回复: 3
打印 上一主题 下一主题

求助:各位兄台,谁有 PostgreSQL trigger 和存储过程的例子给一个. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-25 10:55 |只看该作者 |倒序浏览
最近有项目要用到 PostgreSQL ,原来系统中有很多 trigger, 按照 PostgreSQL 的官方文档,实验了N遍都不成功,已经被它折磨的无语了.
各位兄台,有使用过PostgreSQL的,请给一些Trigger,存储过程,用户函数的例子.
谢谢了!

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2011-08-25 11:58 |只看该作者
官方的文档中的不行吗?

论坛徽章:
0
3 [报告]
发表于 2011-08-26 09:53 |只看该作者
本帖最后由 zlj2208 于 2011-08-26 09:55 编辑

自己搞定了!
我使用Aqua Data Studio 4.7 连接数据库,按照官方文档做实验,报各种错误, 后来同事在psql的命令行执行建立 triigger 和 function 的语句好用,然后就在命令行上做实验,问题解决了。
后来使用pgAdmin III图形工具也可以,不管怎么样问题解决了。下面是我的示例,希望对其他朋友有用。
Postgresql的例子太少了!那是相当少!

目的:对于基本表执行 insert,update,delete  在Log表中记录相关的操作内容。
1. 对基本表进行 insert 后会在log表中生成一条和基本表中相同的记录;
2. 对基本表进行 update 后会在log表中生成对基本表更新前和更新后2条记录;
3. 对基本表进行 delete 后会在log表中生成一条和基本表中相同的记录;
如果出现误操作可以通过log表来修正数据.

连接数据库工具: pgAdmin III
实验步骤:
1. 建立基本表和log表
  1. create table testtable (
  2.   id integer not null primary key ,
  3.   sname varchar(100)
  4. );

  5. CREATE SEQUENCE seq_no1 MINVALUE 1;

  6. CREATE TABLE logtesttable (
  7.   logtestid INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq_no1'),
  8.   id INTEGER,
  9.   sname VARCHAR(100),
  10.   updt_type VARCHAR(20) ,
  11.   updt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  12. );
复制代码
2. 建立 Trigger 和 Function
  1. ---------------------------------------------
  2. --创建trigger调用的函数
  3. --
  4. CREATE OR REPLACE FUNCTION fun_trigger_insert()
  5. RETURNS TRIGGER
  6. LANGUAGE PLPGSQL
  7. AS
  8. $BODY$
  9. BEGIN
  10.   INSERT INTO logtesttable(id,sname,updt_type,updt_time)
  11.   VALUES(new.id,new.sname,'insert',current_timestamp);
  12. return new;
  13. END;
  14. $BODY$;

  15. CREATE OR REPLACE FUNCTION fun_trigger_update()
  16. RETURNS TRIGGER
  17. LANGUAGE PLPGSQL
  18. AS
  19. $BODY$
  20. BEGIN
  21.   INSERT INTO logtesttable(id,sname,updt_type,updt_time)
  22.   VALUES(OLD.id,OLD.sname,'before_update',current_timestamp);
  23.   INSERT INTO logtesttable(id,sname,updt_type,updt_time)
  24.   VALUES(new.id,new.sname,'after_update',current_timestamp);
  25. return new;
  26. END;
  27. $BODY$;

  28. CREATE OR REPLACE FUNCTION fun_trigger_delete()
  29. RETURNS TRIGGER
  30. LANGUAGE PLPGSQL
  31. AS $BODY$
  32. BEGIN
  33.   INSERT INTO logtesttable(id,sname,updt_type,updt_time)
  34.   VALUES(OLD.id,OLD.sname,'delete',current_timestamp);
  35. return OLD;
  36. END;
  37. $BODY$;

  38. -----------------------
  39. --建立Trigger
  40. --
  41. CREATE TRIGGER TRIGGER_INSERT
  42. AFTER INSERT ON testtable
  43. FOR EACH ROW EXECUTE PROCEDURE fun_trigger_insert();

  44. CREATE TRIGGER TRIGGER_UPDATE
  45. AFTER UPDATE ON testtable
  46. FOR EACH ROW EXECUTE PROCEDURE fun_trigger_update();

  47. CREATE TRIGGER TRIGGER_DELETE
  48. AFTER DELETE ON testtable
  49. FOR EACH ROW EXECUTE PROCEDURE fun_trigger_delete();
复制代码
3. 检验Trigger是否生效
1). insert 操作
  1. insert into testtable values (10,'aaaaa');
  2. insert into testtable values (20,'bbbbb');
复制代码
查询数据库结果:
  1. select * from testtable;
  2. select * from logtesttable;
  3. ------------------------
  4. 输出结果:
  5. ------------------------
  6. id     sname   
  7. -----  --------
  8. 10     aaaaa   
  9. 20     bbbbb   

  10. 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  11. [Executed: 11-8-26 上午09时49分05秒 ] [Execution: 0/ms]

  12. logtestid     id     sname     updt_type     updt_time                  
  13. ------------  -----  --------  ------------  --------------------------
  14. 1             10     aaaaa     insert        2011-08-26 09:42:14.711853
  15. 2             20     bbbbb     insert        2011-08-26 09:42:14.711853

  16. 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  17. [Executed: 11-8-26 上午09时49分05秒 ] [Execution: 0/ms]

复制代码
2). update 操作
  1. update testtable set sname='xxxxxx' where id=20;
复制代码
查询数据库结果:
  1. select * from testtable where id=20;
  2. select * from logtesttable where id=20;
  3. ------------------------
  4. 输出结果:
  5. ------------------------
  6. id     sname   
  7. -----  --------
  8. 10     aaaaa   
  9. 20     xxxxxx   

  10. 2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  11. [Executed: 11-8-26 上午09时49分55秒 ] [Execution: 0/ms]

  12. logtestid     id     sname     updt_type      updt_time                  
  13. ------------  -----  --------  -------------  --------------------------
  14. 1             10     aaaaa     insert         2011-08-26 09:42:14.711853
  15. 2             20     bbbbb     insert         2011-08-26 09:42:14.711853
  16. 3             20     bbbbb     before_update  2011-08-26 09:43:21.574783
  17. 4             20     xxxxxx    after_update   2011-08-26 09:43:21.574783

  18. 4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  19. [Executed: 11-8-26 上午09时49分55秒 ] [Execution: 0/ms]
复制代码
3). delete 操作
  1. delete from testtable where id=20;
复制代码
查询数据库结果:
  1. select * from testtable;
  2. select * from logtesttable;
  3. ------------------------
  4. 输出结果:
  5. ------------------------
  6. id     sname   
  7. -----  --------
  8. 10     aaaaa   

  9. 1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  10. [Executed: 11-8-26 上午09时51分21秒 ] [Execution: 0/ms]

  11. logtestid     id     sname     updt_type      updt_time                  
  12. ------------  -----  --------  -------------  --------------------------
  13. 1             10     aaaaa     insert         2011-08-26 09:42:14.711853
  14. 2             20     bbbbb     insert         2011-08-26 09:42:14.711853
  15. 3             20     bbbbb     before_update  2011-08-26 09:43:21.574783
  16. 4             20     xxxxxx    after_update   2011-08-26 09:43:21.574783
  17. 5             20     xxxxxx    delete         2011-08-26 09:44:44.509704

  18. 5 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

  19. [Executed: 11-8-26 上午09时51分21秒 ] [Execution: 16/ms]
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-09-08 16:26 |只看该作者
多谢楼主,很不错的例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP