我有一张桌子:
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 举报,一经查实,本站将立刻删除。