Pgsql之触发器使用

使用示例:

  需求描述: 当读者状态更新的时候,保存状态更新的时间。

  需求场景: 系统开发基本完成,处于维护阶段

  思路: 由于系统已经完成,代码层面很难兼顾找寻所有状态修改的地方,即便找到,修改起来也是一件繁琐的事。首先,思考AOP编程(很难进行拦截处理),其次数据库DB层面(决定使用触发器处理)。

-- hb.r
select * from  lt_dzheinfo order by optime asc limit 5

alter table lt_dzheinfo add column status_update_optime TIMESTAMP;

create or replace function reader_change_status_optime() returns trigger as $$
begin
	if old.ztai != new.ztai
	then update lt_dzheinfo set status_update_optime = CURRENT_TIMESTAMP where dzid = old.dzid;
	end if;
	return new;
end;
$$
language plpgsql;

create trigger reader_change_status_trigger after update of ztai on lt_dzheinfo 
for each row execute procedure reader_change_status_optime();

update lt_dzheinfo set ztai = '过期' where dzid = '9ee21a993b9a47febb3c22cddbe38368'

pgsql触发器重点:

  1.  语法结构(不细讲: https://www.cnblogs.com/zhangruiyuan/p/11416657.html)
  2.  调用的存储过程返回值类型是trigger
  3.  灵活使用old和new
  4.  PostgreSQL 触发器可以在下面几种情况下触发: (Pgsql教程)

    • 在执行操作之前(在检查约束并尝试插入、更新或删除之前)。
    • 在执行操作之后(在检查约束并插入、更新或删除完成之后)。
    • 更新操作(在对一个视图进行插入、更新、删除时)。
  5.  触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。

  6.  WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。

  7.  如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。

  8.  BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

  9.  要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。

  10. 当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。

你可能感兴趣的:(PostSQL)