簡體   English   中英

PostgreSQL更新觸發器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM