pg触发器以及自己遇到的错误

PostgreSQL 触发器

PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。
下面是关于 PostgreSQL 触发器几个比较重要的点:
PostgreSQL 触发器可以在下面几种情况下触发:
在执行操作之前(在检查约束并尝试插入、更新或删除之前)。
在执行操作之后(在检查约束并插入、更新或删除完成之后)。
更新操作(在对一个视图进行插入、更新、删除时)。
触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。
WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。
如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。
BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。

触发器的使用

这里我想利用存储的经度度数据自动更新空间字段,
设置触发器函数

create or replace function autoUpdateCoordinate()
returns trigger as $$
begin
	update pois set geom = st_geometryfromtext('POINT('|| new.longitude||' '|| new.latitude||')',4326) 
	where id = new.id ;
	return new;
end;
$$ language plpgsql;

设置触发器

CREATE TRIGGER autoUdatePOIsCoordinate
after update on student
for each row execute procedure autoUpdateCoordinate();

更新数据,

update pois set latitude=43.007721 where id = 1;

到这里遇到一个大坑,执行更新语句之后报错

ERROR: 错误:  堆栈深度超过限制
HINT:  在确定了平台的堆栈深度限制是足够大后,增加配置参数 "max_stack_depth"的值(当前值为2048kB).
CONTEXT:  SQL 语句 "update pois set geom = st_geometryfromtext('POINT('|| new.longitude||' '|| new.latitude||')',4326) 
	where id = new.id"

我以为是触发器或者是触发器函数写错了,想了好长时间是我的逻辑错误,更新数据时需要触发我的触发器,于是触发器去执行触发器函数,又对表进行更新,于是又触发了触发器,无线循环,哈哈哈,感觉自己好蠢啊,就这样执行错误是堆栈超过限制。
解决方法,在特定字段更新时,触发触发器。

删除表中的触发器

#删除触发器
drop trigger autoUpdatePOIsCoordinate on pois;
#查看触发器
SELECT * FROM pg_trigger

修改表触发器语句

CREATE TRIGGER autoUdatePOIsCoordinateLatitude
after update of latitude on pois
for each row execute procedure autoUpdateCoordinate();

版权声明:本文为Night_of_light原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。