当前位置:   article > 正文

postgre简单存储过程+触发器demo_pg数据库触发器和存吃过程

pg数据库触发器和存吃过程

一个最简易的存储过程 + 触发器的demo

  1. --创建一张test表,为了测试触发器
  2. CREATE TABLE test(
  3. testcol varchar(10)
  4. );
  5. --创建一张test_trigger_record表,为了测试触发器响应后执行的存储过程是否正常执行完毕
  6. CREATE TABLE test_trigger_record(
  7. operation text NOT NULL,
  8. create_time timestamp NOT NULL,
  9. userid text NOT NULL,
  10. test text
  11. );
  12. --创建trigger_audit函数(存储过程),当表操作是‘insert’时,往test_trigger_record表中插入一条数据
  13. --values( 'insert', now(), current_user, NEW.testcol) --》NEW.testcol等同于插入数据的testcol列值
  14. CREATE OR REPLACE FUNCTION trigger_audit() RETURNS TRIGGER AS $$
  15. BEGIN
  16. --RAISE NOTICE日志输出,可在控制台查看执行日志,也可在X:\PostgreSQL\8.3\data\pg_log下的当天日期文件中看到日志输出
  17. RAISE NOTICE 'trigger_audit() --> 存储过程执行中';
  18. IF(TG_OP = 'INSERT') THEN
  19. INSERT INTO test_trigger_record SELECT 'insert', now(), current_user, NEW.testcol;
  20. END IF;
  21. RETURN NULL;
  22. END;
  23. $$ LANGUAGE plpgsql;
  24. --创建一个名为test_trigger的触发器绑定到test表中,表数据每次新增都执行一次
  25. CREATE TRIGGER test_trigger AFTER INSERT ON test FOR EACH ROW EXECUTE PROCEDURE trigger_audit();
  26. --往test表中做插入1条数据
  27. INSERT INTO test (testcol)VALUES('测试触发器');
  28. --查询触发器是否生效(插入一条test表的操作记录)
  29. select * from test_trigger_record;

存储过程开发小知识:

1.在存储过程里面可以输出日志进行跟踪

RAISE NOTICE  ' 存储过程执行中';  
  1. --在存储过程中定义变量
  2. declare sql text;
  3. -- 输出变量,会自动替换占位符%
  4. RAISE NOTICE 'trigger_audit() --> 存储过程中 sql : % ' , sql;

2. 存储过程中拼接sql稍微麻烦点:

 拼接varchar类型变量时需要在变量左右机上 单引号 ', 在字符串内拼接就需要转义单引号,也就是使用三个 ‘ ,最后一个单引号还需要拼接E'\''进行转义

  1. declare shift text;
  2. IF(TG_OP = 'INSERT') THEN
  3. strsql := 'UPDATE ' || TG_TABLE_NAME
  4. || E' set shift = '''|| shift
  5. ||''' where id= ''' || NEW.id
  6. ||''' AND lot =''' || NEW.lot
  7. ||''' AND creat_dt = ''' || NEW.creat_dt ||E'\'';
  8. EXECUTE (strsql); ---执行拼接后的sql

3. 当存储过程因为长时间未使用或没有备注导致需要在N多个存储过程中快速锁定需要修改的那个存储过程:

先把原有存储过程的触发效果触发一次(原本做了什么动作会触发就再做一次,记录执行时间)可在postgre安装目录下的\data\pg_log下的当天日期文件中看到刚刚执行过的存储过程的日志输出,不过是否输出日志取决于存储过程代码中是否有日志输出语句,或者存储过程中有EXECUTE (sql)语句执行也会被日志记录下来(存储过程的函数名会被日志输出),这样就能快速锁定需要修改的存储过程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/786049
推荐阅读
相关标签
  

闽ICP备14008679号