PL/pgSQL 触发阻止一条河流穿越另一条河流
PL/pgSQL trigger to stop a river crossing another river
我必须编写一个触发器来阻止一条河流穿越另一条河流。我真的很挣扎,任何帮助将不胜感激。 myriver
是 table 包含了关于河流的所有信息。因此,在 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();
您正在使用 to-be-inserted/-updated 行 (NEW.the_geom
) 的列作为临时变量。因此,您将覆盖该列变量(为新行提供虚假值),或者在 IF
检查中得到不相关的结果(因为 NEW.the_geom
在触发器 运行).
另请注意,Postgres 和 pl/pgsql 是严格类型化的,因此您不能在 IF
语句中使用任意值来查看它是否是 "empty",例如你会使用像 PHP.
这样的脚本语言
你需要添加 a DECLARE
block 给你一个合适的临时变量,然后检查它是否 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;
我必须编写一个触发器来阻止一条河流穿越另一条河流。我真的很挣扎,任何帮助将不胜感激。 myriver
是 table 包含了关于河流的所有信息。因此,在 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();
您正在使用 to-be-inserted/-updated 行 (NEW.the_geom
) 的列作为临时变量。因此,您将覆盖该列变量(为新行提供虚假值),或者在 IF
检查中得到不相关的结果(因为 NEW.the_geom
在触发器 运行).
另请注意,Postgres 和 pl/pgsql 是严格类型化的,因此您不能在 IF
语句中使用任意值来查看它是否是 "empty",例如你会使用像 PHP.
你需要添加 a DECLARE
block 给你一个合适的临时变量,然后检查它是否 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;