簡體   English   中英

PL / pgSQL觸發阻止河流穿過另一條河流

[英]PL/pgSQL trigger to stop a river crossing another river

我必須寫一個觸發器來阻止河流穿過另一條河流。 我真的很掙扎,任何幫助都會受到贊賞。 myriver是包含河流所有信息的表格。 因此,如果insert一條新河,如果它穿過現有的河流,我應該收到錯誤。 這就是我所擁有的:

CREATE FUNCTION river_check() RETURNS TRIGGER AS $river_check$
BEGIN

-- Check that gid is given
IF NEW.gid IS NULL THEN
   RAISE EXCEPTION 'river gid cannot be null';
END IF;

NEW.the_geom = (SELECT r.the_geom FROM myriver as r
    WHERE ST_CROSSES(NEW.the_geom, r.the_geom)); 

IF NEW.the_geom THEN
    RAISE EXCEPTION 'a river cannot cross another river';
END IF;

RETURN NEW;

END;
$river_check$ LANGUAGE plpgsql;

-- Function river_check is linked to a TRIGGER of same name:
CREATE TRIGGER river_check
BEFORE INSERT OR UPDATE ON myriver
FOR EACH ROW EXECUTE PROCEDURE river_check();

您正在使用要插入/更新的行( NEW.the_geom )的列作為臨時變量。 所以你要么覆蓋那個列變量(給新行一個虛假的值),要么在你的IF檢查中得到一個不相關的結果(因為在運行觸發器之前, NEW.the_geom都有數據)。

另請注意,Postgres和pl / pgsql是嚴格類型的,因此您不能在IF語句中使用任意值來查看它是否為“空”,就像在PHP等腳本語言中一樣。

您需要添加一個DECLARE來為您提供適當的臨時變量,並檢查它是否為IS NULL ; 或者直接使用EXISTS檢查:

IF EXISTS (
    SELECT r.the_geom FROM myriver as r
    WHERE ST_CROSSES(NEW.the_geom, r.the_geom)
)
THEN
    RAISE EXCEPTION 'a river cannot cross another river';
END IF;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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