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