现在位置:首页 > 数据库 > PostgreSQL > PostgreSQL触发器

PostgreSQL触发器

来源:原创文章    由 易百 更新版本    浏览:人次

PostgreSQL的触发器是数据库自动执行\指定的数据库事件发生时调用的回调函数。以下是有关PostgreSQL的触发器的要点: www.yiibai.com

  • PostgreSQL的触发可以指定触发操作前尝试一行(在检查约束之前INSERT,UPDATE或DELETE)或操作完成后(在检查约束之后和INSERT,UPDATE或DELETE(删除)已完成),或替代的操作(在视图上插入,更新或删除的情况下).. www.yiibai.com

  • FOR EACH ROW触发器被标记的操作修改的每一行被称为一次。相比之下,FOR EACH STATEMENT触发器为只执行一次对于任何给定的操作,不管它有多少行修改。

    yiibai.com

  • WHEN子句和触发器动作可能访问的行元素被插入,删除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是从表中的列名的引用该触发器相关联的。 www.yiibai.com

  • 如果提供WHEN子句,PostgreSQL的报表只执行WHEN子句为true的行。如果没有提供WHEN子句,PostgreSQL的语句执行的所有行。 www.yiibai.com

  • 如果有多个相同类型的触发器定义了相同的事件,他们将被触发名称是按字母顺序排列。 www.yiibai.com

  • BEFORE,AFTER或INSTEAD OF关键字决定何时触发动作将被执行,相对于插入,修改或移除相关的行。 www.yiibai.com

  • 触发器表,它们与丢弃时自动删除。 yiibai.com

  • 要修改的表必须存在,在同一数据库中的表或视图,触发器被附加,必须使用表名而不使用database.tablename。

    yiibai.com

  • 约束时指定的选项创建一个约束触发器。这是一个普通的触发器除外,可以调整使用SET(设定)约束的触发器触发的定时相同。预计约束触发器违反他们所实施的限制时引发异常.. yiibai.com

语法:

创建触发器的基本语法如下:

yiibai.com

CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- Trigger logic goes here....
]; www.yiibai.com 

Here event_name could be INSERT, DELETE, UPDATE, and TRUNCATE database operation on the mentioned table table_name. You can optionally specify FOR EACH ROW after table name.

www.yiibai.com

Following is the syntax of creating a trigger on an UPDATE operation on one or more specified columns of a table as follows:

yiibai.com

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Trigger logic goes here....
]; 
www.yiibai.com

例子

让我们考虑一个情况下,我们要保持审核COMPANY表中的每一条记录被插入,我们将创建新如下(如果已经创建过,那么删除COMPANY表) www.yiibai.com

testdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
); www.yiibai.com 

为了保持审核的测试,我们将创建一个新的表被称为审计将被插入日志消息每当有一个新的记录条目表COMPANY: www.yiibai.com

testdb=# CREATE TABLE AUDIT(
    EMP_ID INT NOT NULL,
    ENTRY_DATE TEXT NOT NULL
); 

yiibai.com

这里的ID是审计记录ID,EMP_ID的ID来自COMPANY表,日期将保持公司表时的记录将被创建时间戳。所以,现在让我们创建一个触发器,COMPANY 表如下:

yiibai.com

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc(); yiibai.com 

auditlogfunc()是一个PostgreSQL的过程,有以下定义:

www.yiibai.com

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
    BEGIN
        INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
        RETURN NEW;
    END;
$example_table$ LANGUAGE plpgsql; 
www.yiibai.com

现在,让我们开始COMPANY 表插入记录,这将导致在审核表中创建审计日志记录。因此,让我们创建一个COMPANY 表记录如下:

yiibai.com

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 ); 
yiibai.com

这将创建一个记录COMPANY 表如下: yiibai.com

 id | name | age | address      | salary
----+------+-----+--------------+--------
  1 | Paul |  32 | California   |  20000 

www.yiibai.com

同时审核表中创建一条记录。这条记录是一个触发我们已经创建了COMPANY 表上的INSERT操作的结果。类似的方式,也可以创建触发器,UPDATE和DELETE操作根据要求。 yiibai.com

 emp_id |          entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)
 
yiibai.com

列出触发器

可以列出当前数据库中的所有触发器从pg_trigger表如下:

www.yiibai.com

testdb=# SELECT * FROM pg_trigger; yiibai.com 

以上PostgreSQL的表会列出所有触发器。 www.yiibai.com

如果要列出特定表上的触发器,然后使用条款与表名如下:

www.yiibai.com

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company'; yiibai.com 

以上PostgreSQL的表也会列出只有一个条目如下: www.yiibai.com

     tgname
-----------------
 example_trigger
(1 row)
 www.yiibai.com 

删除触发器

以下是DROP命令可以用来删除一个现有的触发: yiibai.com

testdb=# DROP TRIGGER trigger_name; yiibai.com 
本站文章除注明转载外,均为本站原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,传播学习教程;
转载请注明:文章转载自:易百教程 [http://www.yiibai.com]
本文标题:PostgreSQL触发器
转载请保留原文链接:http://www.yiibai.com/html/postgresql/2013/080673.html
上一篇:PostgreSQL ALIAS语法      下一篇:PostgreSQL索引