微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL更新触发器

我有一张桌子:
CREATE TABLE annotations
(
  gid serial NOT NULL,annotation character varying(250),the_geom geometry,"rotationAngle" character varying(3) DEFAULT 0,CONSTRAINT annotations_pkey PRIMARY KEY (gid),CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2),CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
)

并触发:

CREATE TRIGGER set_angle
AFTER INSERT OR UPDATE
ON annotations
FOR EACH ROW
EXECUTE PROCEDURE setangle();

功能

CREATE OR REPLACE FUNCTION setAngle() RETURNS TRIGGER AS $$
BEGIN
IF    TG_OP = 'INSERT' THEN
    UPDATE annotations SET "rotationAngle" = degrees( ST_Azimuth( ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom) ) )-90 WHERE gid = NEW.gid;
    RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
    UPDATE annotations SET "rotationAngle" = degrees( ST_Azimuth( ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom) ) )-90 WHERE gid = NEW.gid;
    RETURN NEW;
END IF;
END;
$$LANGUAGE plpgsql;

当在表格或行中插入新行时,我想要使用函数结果设置字段rotationAngle.
但是当我在表函数中插入新行时不起作用.我的意思是,rotationAngle值没有改变.

有什么不对?

作为 @SpartanElite pointed out,你正在触发一个无限循环.

简化触发功能

CREATE OR REPLACE FUNCTION set_angle()
  RETURNS TRIGGER AS
$func$
BEGIN
   NEW."rotationAngle" := degrees(
                             ST_Azimuth(
                                ST_StartPoint(NEW.the_geom),ST_EndPoint(NEW.the_geom)
                             )
                          ) - 90;
   RETURN NEW;
END
$func$LANGUAGE plpgsql;

>直接分配给NEW.在这种情况下没有.
>您必须双引号非法列名称.最好不要使用这些名称.
Recent related answer.
>插入代码&升级是一样的.我折叠成一个代码路径.

使用BEFORE触发器.这样,您可以在保存之前直接编辑触发行的列:

CREATE TRIGGER set_angle
BEFORE INSERT OR UPDATE ON annotations
FOR EACH ROW EXECUTE PROCEDURE set_angle();

然而

如果您只是试图在表中保持功能相关的值(并且没有其他考虑因素):不要.改为使用视图或生成的列:

> Store common query as column?

那你就不需要了.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐