如何根据第二层,触发器,postgreSQL自动更新列

时间:2014-12-25 14:39:23

标签: postgresql triggers qgis

我是postgreSQL的新手。我有2个表,观察和landcover,我想创建一个触发器,允许根据第二层(表)landcover.code_06的空间信息更新列observation.land。

我的意思是,如果我在QGIS中更新点层观察,我希望在属性表中具有与列CODE_06中的列相同的信息。

我创造了这个,但我不知道,有什么不对或为什么它不起作用。


ALTER TABLE observation ADD COLUMN land varchar (20)

CREATE OR REPLACE FUNCTION landinfo_land()
  RETURNS trigger AS
$BODY$
  BEGIN
    NEW.land := observation.land

                  FROM observation.land AS b, landcover.code_06 AS  w
          WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);
    RETURN NEW;
  END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION landinfo_land() OWNER TO postgres;


CREATE TRIGGER update_land_value
  BEFORE INSERT OR UPDATE
  ON observation
  FOR EACH ROW
  EXECUTE PROCEDURE landinfo_land();

1 个答案:

答案 0 :(得分:1)

此:

 NEW.land := observation.land

                  FROM observation.land AS b, landcover.code_06 AS  w
          WHERE w.geom && NEW.geom AND
ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);

没有任何意义。

您似乎尝试使用子查询而不是简单的表达式,但是没有SELECT个关键字。即使在PL / PgSQL中也无法做到这一点。如果它不是一个没有SQL查询关键字的简单表达式,那么它必须是一个有效的查询。

尝试:

 SELECT INTO STRICT NEW.land  observation.land
 FROM observation.land AS b, landcover.code_06 AS  w
 WHERE w.geom && NEW.geom AND
 ST_Intersects(ST_PointOnSurface(NEW.geom), b.geom);

是的,语法很难看。

如果仍有问题,请检查PostgreSQL服务器错误日志。它们将包含指示执行PL / PgSQL函数时出错的错误消息,这将帮助您找到其他错误。