一份菜单

带有EMP表示例的PostgreSQL触发器教程

题: 我已经在Oracle数据库中创建了触发器。但是我’是PostgreSQL的新功能。您能解释一下如何在Postgres中使用适当的示例创建触发器吗?es?

回答: 当表中发生事件(插入,删除或更新)时,可以使用触发器来执行功能。让我们通过示例回顾如何创建触发器。

1. PostgreSQL创建演示表

创建emp_table和backup_tbl,如下所示。

CREATE TABLE emp_table ( empid int, empname name, salary int );
CREATE TABLE backup_tbl ( empid int, empname name, salary int, operation varchar(25) );

有关一些postgreSQL命令,请参阅我们前面的内容。 15个高级postgreSQL命令 文章。

2. PostgreSQL创建语言

创建触发所需的语言plpgsql。

CREATE LANGUAGE plpgsql;

3.创建PostgreSQL触发函数

该函数将在插入,删除或更新操作之前被调用。它执行以下操作:

  • 在删除操作之前,它将旧数据插入backup_tbl。
  • 在更新操作之前,它将旧数据插入backup_tbl。
  • 在插入操作之前,它将新数据插入backup_tbl。
CREATE FUNCTION ins_function() RETURNS trigger AS '
BEGIN
  IF tg_op = ''DELETE'' THEN
     INSERT INTO backup_tbl(empid, empname, salary, operation)
     VALUES (old.empid, old.empname, old.salary, tg_op);
     RETURN old;
  END IF;
  IF tg_op = ''INSERT'' THEN
     INSERT INTO backup_tbl(empid, empname, salary, operation)
     VALUES (new.empid, new.empname, new.salary, tg_op);
     RETURN new;
  END IF;
  IF tg_op = ''UPDATE'' THEN
     INSERT INTO backup_tbl(empid, empname, salary, operation)
     VALUES (old.empid, old.empname, old.salary, tg_op);
     RETURN new;
  END IF;
END
' LANGUAGE plpgsql;

4.创建PostgreSQL触发器

使用下面的create trigger sql命令,创建一个将调用该函数的触发器‘ins_function’插入,删除或更新操作之后。

在插入,删除或更新之后创建触发器audit_ins
        在每个行的emp_table上
        执行程序ins_function();

确保使用以下方法备份postgreSQL数据库 pg_dump和psql 命令。

5.测试PostgreSQL触发器

尝试将示例数据插入到空容器中,这将根据触发逻辑将数据自动插入到backup_table中。

# INSERT INTO emp_table (empid, empname, salary) values (101, 'sathiya', '3000');
INSERT 0 1
# SELECT * from backup_tbl ;
 empid | empname | salary | operation
-------+---------+--------+-----------
   101 | 萨提亚 |   3000 | INSERT
(1 row)

尝试更新为emptable的数据,这将根据触发逻辑将旧数据自动插入backup_tbl。

# UPDATE emp_table SET salary = '2500' where empid = '101';
UPDATE 1
# SELECT * from backup_tbl ;
 empid | empname | salary | operation
-------+---------+--------+-----------
   101 | 萨提亚 |   3000 | INSERT
   101 | 萨提亚 |   3000 | UPDATE
(2 rows)

尝试删除可清空的数据,这将根据触发逻辑将旧数据自动插入到backup_tbl中。

# DELETE FROM emp_table WHERE empid = '101';
DELETE 1
# SELECT * from backup_tbl ;
 empid | empname | salary | operation
-------+---------+--------+-----------
   101 | 萨提亚 |   3000 | INSERT
   101 | 萨提亚 |   3000 | UPDATE
   101 | 萨提亚 |   2500 | DELETE

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 17 评论 … 加一 }

  • Balakrishnan Mariyappan 2010年10月7日,上午7:49

    好刷新!!!

  • 摩根B. 2011年6月3日,下午2:45

    嗨,我正在尝试您的例子,但是我可以’t测试PostgreSQL触发器,发生这种情况:

    当我执行时:#将INSERT INTO emp_table(empid,empname,salary)值(101,‘sathiya’, ‘3000’);

    **********错误**********

    错误:语法错误在或附近“#”
    SQL状态:42601
    性格:1

    拜托,你能帮我吗?我遵循了您的所有步骤。

  • Puu2 2011年6月5日,上午6:39

    您必须执行以下命令:
    将INSERT插入emp_table(empid,empname,salary)值(101,“ sathiya”,“ 3000”);
    没有 ‘#’..

  • 杰伊·约翰逊(Jay 约翰 son) 2012年8月9日,上午2:36

    嗨,谢谢你,我尝试了一下,但是遇到了这个错误:new.empid列不存在。

  • 纳西尔·乌丁(Nasir Uddin) 2012年9月8日,上午8:02

    这篇文章对我很有帮助。
    谢谢

  • 杰森·C 2012年11月10日,晚上11:05

    很有帮助。总是很高兴看到一个容易遵循的简单示例。

    谢谢!

  • 普尼思·雷迪 2013年2月21日,下午1:54

    你好

    谢谢您的解释。
    您能为变量提供一些解释吗“tg_op”在触发函数中,您曾经知道该事件发生在表上。

    谢谢并恭祝安康,
    普尼思·雷迪

  • 普尼思·雷迪 2013年2月21日,下午2:24

    你好

    我知道了ðŸ™,
    pg_op是一个PostgreSQL_operation变量,默认情况下,它在表ðŸ™,上保存有关操作的数据

    谢谢并恭祝安康,
    普尼思·雷迪

  • 肯定的 2013年3月1日,上午1:06

    我尝试了上面的触发程序,它已在我的pgadmin中成功执行

  • 匿名 2013年4月18日,上午2:01

    它显示错误tg_op不存在

  • 卢卡斯 2013年8月5日,上午5:29

    太好了!谢谢 !

  • 迪内什乔希 2013年8月10日,上午5:43

    感谢你 ..!

  • 悉尼 2013年9月11日,上午10:26

    谢谢拉梅什,辛苦了

  • 约翰 2013年11月5日,上午10:53

    谢谢。非常感谢:一个实际可行的示例。太棒了

  • 拉穆·马蒂(Ramu Mathi) 2014年11月5日,上午4:42

    嗨,大家好,

    你们能帮我澄清一下吗?

    在插入,删除或更新之后创建触发器audit_ins
    在每个行的emp_table上
    执行程序ins_function();

    在这里,我们调用过程而不是函数。其实ins_function()函数正确吗?然后我们调用过程。

    谢谢,
    拉木

  • 莫赫德·伊姆兰(Mohd Imran) 2015年2月27日,上午1:25

    非常感谢你…great job!!!

  • 西米 2015年3月19日,上午2:56

    十分感谢..
    很好的解释。

发表评论