Postgresql PostGIS触发功能——达到最大堆栈深度
试图在PostGIS中创建动态触发函数,但收到“最大堆栈深度”错误消息 我在PostGRES/GIS中有两个表,其中包含geometry的testzone.carsurtest和political.localities,我正在尝试使用ST_相交从'locality_name'字段political.localities更新testzone.carsurtest中的'locality'字段。我已经成功地为testzone.carsurtest创建了一个触发器函数,但是我想创建一个动态触发器函数,用于多个希望从本地表更新的表Postgresql PostGIS触发功能——达到最大堆栈深度,postgresql,triggers,stack-overflow,postgis,Postgresql,Triggers,Stack Overflow,Postgis,试图在PostGIS中创建动态触发函数,但收到“最大堆栈深度”错误消息 我在PostGRES/GIS中有两个表,其中包含geometry的testzone.carsurtest和political.localities,我正在尝试使用ST_相交从'locality_name'字段political.localities更新testzone.carsurtest中的'locality'字段。我已经成功地为testzone.carsurtest创建了一个触发器函数,但是我想创建一个动态触发器函数,用
CREATE OR REPLACE FUNCTION tf_locality_test()
RETURNS trigger AS
$BODY$
DECLARE
tbl text := TG_TABLE_NAME;
scm text := TG_TABLE_SCHEMA;
BEGIN
EXECUTE 'UPDATE '|| quote_ident(cast(scm as text)) ||'.'|| quote_ident(cast(tbl as text)) ||' AS dyntbl
SET locality = political.locality.locality_name
FROM political.locality
WHERE ST_Intersects(dyntbl.wkb_geometry, political.locality.wkb_geometry)';
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION tf_locality_test() OWNER TO postgres;
在QGIS中创建新多边形记录时,我收到以下错误消息:
>
如有任何建议,将不胜感激。
谢谢
Chris这里的问题是,在一个表上有一个
BEFORE UPDATE
触发器,它有一条语句来更新同一个表:递归。一段时间后,有太多触发器等待EXECUTE
语句完成(每个触发器调用相同的触发器函数),堆栈被填满。使用NEW
隐式参数设置字段locality
的值,而不是在触发器函数中执行动态UPDATE
:
CREATE OR REPLACE FUNCTION tf_locality_test() RETURNS trigger AS $BODY$
BEGIN
SELECT loc.locality_name INTO NEW.locality
FROM political.localities loc
WHERE ST_Intersects(NEW.wkb_geometry, loc.wkb_geometry);
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
只要其他表具有具有适当定义的
局部性
和wkb_几何体
列,那么每个表都可以有一个BEFORE UDPATE
触发器来调用相同的触发器函数。这里的问题是,在一个表上有一个BEFORE UPDATE
触发器,该表有一条语句来更新相同的表:递归。一段时间后,有太多触发器等待EXECUTE
语句完成(每个触发器调用相同的触发器函数),堆栈被填满。使用NEW
隐式参数设置字段locality
的值,而不是在触发器函数中执行动态UPDATE
:
CREATE OR REPLACE FUNCTION tf_locality_test() RETURNS trigger AS $BODY$
BEGIN
SELECT loc.locality_name INTO NEW.locality
FROM political.localities loc
WHERE ST_Intersects(NEW.wkb_geometry, loc.wkb_geometry);
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
只要其他表具有具有适当定义的
局部性
和wkb_几何体
列,那么每个表都可以有一个BEFORE UDPATE
触发器来调用相同的触发器函数。这里的问题是,在一个表上有一个BEFORE UPDATE
触发器,该表有一条语句来更新相同的表:递归。一段时间后,有太多触发器等待EXECUTE
语句完成(每个触发器调用相同的触发器函数),堆栈被填满。使用NEW
隐式参数设置字段locality
的值,而不是在触发器函数中执行动态UPDATE
:
CREATE OR REPLACE FUNCTION tf_locality_test() RETURNS trigger AS $BODY$
BEGIN
SELECT loc.locality_name INTO NEW.locality
FROM political.localities loc
WHERE ST_Intersects(NEW.wkb_geometry, loc.wkb_geometry);
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
只要其他表具有具有适当定义的
局部性
和wkb_几何体
列,那么每个表都可以有一个BEFORE UDPATE
触发器来调用相同的触发器函数。这里的问题是,在一个表上有一个BEFORE UPDATE
触发器,该表有一条语句来更新相同的表:递归。一段时间后,有太多触发器等待EXECUTE
语句完成(每个触发器调用相同的触发器函数),堆栈被填满。使用NEW
隐式参数设置字段locality
的值,而不是在触发器函数中执行动态UPDATE
:
CREATE OR REPLACE FUNCTION tf_locality_test() RETURNS trigger AS $BODY$
BEGIN
SELECT loc.locality_name INTO NEW.locality
FROM political.localities loc
WHERE ST_Intersects(NEW.wkb_geometry, loc.wkb_geometry);
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
只要其他表具有具有适当定义的
局部性
和wkb_几何体
列,那么每个表都可以在UDPATE之前有一个调用相同触发函数的触发器。。这起作用了。:)好极了这起作用了。:)好极了这起作用了。:)好极了这起作用了。:)