Postgresql PostGIS触发功能——达到最大堆栈深度

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创建了一个触发器函数,但是我想创建一个动态触发器函数,用

试图在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之前有一个调用相同触发函数的
触发器。

。这起作用了。:)好极了这起作用了。:)好极了这起作用了。:)好极了这起作用了。:)