[英]PostgreSQL Update trigger
我有一張桌子:
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指出的那樣 ,你正在觸發一個無限循環。
簡化觸發功能:
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
。 沒有WHERE
在這種情況下。 使用BEFORE
觸發器。 這樣,您可以在保存之前直接編輯觸發行的列:
CREATE TRIGGER set_angle
BEFORE INSERT OR UPDATE ON annotations
FOR EACH ROW EXECUTE PROCEDURE set_angle();
如果您只是試圖在表中保持功能相關的值(並且沒有其他考慮因素): 不要 。 改為使用視圖或生成的列:
那你就不需要了。
這里有很多錯誤。 1)當你插入一行'A'時,調用函數setAngle()
。 但是在函數中你正在調用函數中的另一個update
,它將再次觸發函數,再次,等等......要解決此問題,請不要發布更新! 只需單獨更新NEW記錄值並將其返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.