触发器的创建语法

1
2
3
4
5
6
7
8
CREATE [CONSTRAINT] TRIGGER name 
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ...] }
ON table_name
[ FROM referenced_table_name ]
{[ NOT DEFERRABLE ][ DEFERRABLE ]{[ INITIALLY IMMEDIATE ][ INITIALLY DEFERRED]}}
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN (condition) ]
EXECUTE PROCEDURE function_name ( arguments )

触发器创建步骤

先为触发器创建一个执行函数,返回类型为触发器类型,然后创建相应的触发器

1
2
3
4
5
6
7
8
9
10
11
create or replace function trigger_loans_tmp_del() returns TRIGGER as $trigger$
begin
...
return null;
end;
$trigger$ LANGUAGE plpgsql;

CREATE trigger tr_loans_tmp
before delete on loans_tmp
for each row
execute procedure trigger_loans_tmp_del();

触发器的分类如下:

  • 语句级触发器:一条SQL语句,触发器只执行一次,即使是修改了零行数据的SQL,也会导致相应的触发器执行。
  • 行级触发器:每行发生变化,就会执行一次触发器。
  • BEFORE触发器:在触发事件之前执行触发器。
  • AFTER触发器:在触发事件之后执行触发器。

触发器中的一些特殊变量

  • NEW 数据类型是RECORD;该变量为行级触发器中的INSERT/UPDATE操作保持新数据行。在语句级别的触发器以及DELETE操作,这个变量未被赋值。
  • OLD 数据类型是RECORD;该变量为行级触发器中的UPDATE/DELETE操作保持新数据行。在语句级别的触发器以及INSERT操作,这个变量未被赋值。
  • TG_NAME 数据类型是name;该变量包含实际触发的触发器名。
  • TG_WHEN 数据类型是text;是值为BEFORE、AFTER或INSTEAD OF的一个字符串,取决于触发器的定义。
  • TG_LEVEL 数据类型是text;是值为ROW或STATEMENT的一个字符串,取决于触发器的定义。
  • TG_OP 数据类型是text;是值为INSERT、UPDATE、DELETE或TRUNCATE的一个字符串,它说明触发器是为哪个操作引发。
  • TG_RELID 数据类型是oid;是导致触发器调用的表的对象 ID。
  • TG_RELNAME 数据类型是name;是导致触发器调用的表的名称。现在已经被废弃,并且可能在未来的一个发行中消失。使用TG_TABLE_NAME替代。
  • TG_TABLE_NAME 数据类型是name;是导致触发器调用的表的名称。
  • TG_TABLE_SCHEMA 数据类型是name;是导致触发器调用的表所在的模式名。
  • TG_NARGS 数据类型是integer;在CREATE TRIGGER语句中给触发器过程的参数数量。
  • TG_ARGV[] 数据类型是text数组;来自CREATE TRIGGER语句的参数。索引从 0 开始记数。非法索引(小于 0 或者大于等于tg_nargs)会导致返回一个空值。

触发器要点

  • FOR EACH ROW触发器被标记的操作修改的每一行被称为一次
  • FOR EACH STATEMENT触发器为只执行一次对于任何给定的操作,不管它有多少行修改。
  • WHEN子句和触发器动作可能访问的行元素被插入,删除或更新使用的形式NEW.column-name和OLD.column-name,其中列名是从表中的列名的引用该触发器相关联的。
  • 如果提供WHEN子句,PostgreSQL的报表只执行WHEN子句为true的行。如果没有提供WHEN子句,PostgreSQL的语句执行的所有行。
  • 如果有多个相同类型的触发器定义了相同的事件,他们将被触发名称是按字母顺序排列。
  • BEFORE,AFTER或INSTEAD OF关键字决定何时触发动作将被执行,相对于插入,修改或移除相关的行。
  • 触发器表,它们与丢弃时自动删除。
  • 要修改的表必须存在,在同一数据库中的表或视图,触发器被附加,必须使用表名而不使用database.tablename。
  • 约束时指定的选项创建一个约束触发器。这是一个普通的触发器除外,可以调整使用SET(设定)约束的触发器触发的定时相同。预计约束触发器违反他们所实施的限制时引发异常