PostgreSQL更新触发器
发布时间:2020-12-13 18:09:51 所属栏目:百科 来源:网络整理
导读:我有一张桌子: 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
我有一张桌子:
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. 有什么不对?
作为
@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.在这种情况下没有. 使用BEFORE触发器.这样,您可以在保存之前直接编辑触发行的列: CREATE TRIGGER set_angle BEFORE INSERT OR UPDATE ON annotations FOR EACH ROW EXECUTE PROCEDURE set_angle(); 然而 如果您只是试图在表中保持功能相关的值(并且没有其他考虑因素):不要.改为使用视图或生成的列: > Store common query as column? 那你就不需要了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |