【发布时间】:2017-06-22 03:27:01
【问题描述】:
我对 PostgreSQL 有疑问。我想在单个查询中创建触发器和触发器函数,这样我就可以更快地进行触发器。 这是我的触发函数:
CREATE FUNCTION public.tda_a1()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100.0
VOLATILE NOT LEAKPROOF
COST 100.0
AS $BODY$
BEGIN
DELETE FROM ref_dati2 where kd_propinsi = OLD.kd_propinsi;
RETURN OLD;
END;
$BODY$;
这就是触发器:
CREATE TRIGGER tda_a1
BEFORE DELETE
ON public.ref_propinsi
FOR EACH ROW
EXECUTE PROCEDURE public.tda_a1();
我尝试将它们加入到一个查询中,但失败了。也许有人可以帮助我。
【问题讨论】:
-
不,这是不可能的。为什么你认为这会“更快”?目前运行这两个语句需要多长时间?你需要多快?
-
@a_horse_with_no_name 如果只有 2 或 3 个触发器,则不需要很长时间,但我有 192 个触发器。我想像在 Oracle 中那样在单个查询中执行它们
-
@a_horse_with_no_name 当然,我可以一个一个地执行它们,但是这需要很长时间,并且每次执行都必须小心。实际上我可以在单个查询中执行多个触发器(绑定到表上的特定操作),但对触发器函数不起作用
-
我仍然不明白您要解决的实际问题是什么。如果没有函数,就无法在 Postgres 中定义触发器。该函数确实可以重复使用,因此每个触发器不需要两个语句。你说你“需要小心每次执行”。如果您缺少有关如何管理架构定义和迁移的正确概念,这听起来对我来说很重要。查看 [Liquibase](liquibase.org) 或 Flyway 之类的工具,它们将帮助您管理和运行架构迁移
标签: sql postgresql plpgsql ddl database-trigger