【发布时间】:2018-03-29 19:51:56
【问题描述】:
这主要是一个风格问题。
我有一个 AFTER INSERT OR UPDATE 触发器。我想针对任何可用的 NEW/OLD 记录运行 same 查询。与其让条件检查 TG_OP 并复制查询,确定哪些可用并循环它们的最简洁方法是什么?
示例代码:
CREATE FUNCTION myfunc() RETURNS TRIGGER AS $$
DECLARE
id int;
ids int[];
BEGIN
IF TG_OP IN ('INSERT', 'UPDATE') THEN
ids := ids || NEW.id;
END IF;
IF TG_OP IN ('UPDATE', 'DELETE') THEN
ids := ids || OLD.id;
END IF;
FOREACH id IN ARRAY ARRAY(SELECT DISTINCT UNNEST(ids))
LOOP
RAISE NOTICE 'myfunc called for % on id %', TG_OP, id;
/* RUN QUERY REFERENCING id */
END LOOP;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
是否有更短/更简单/更惯用的方法来实现这一目标?
【问题讨论】:
-
您在寻找
ids := ids || new.id吗? (但你必须将ids初始化为一个空数组,而不是null)详见手册:postgresql.org/docs/current/static/functions-array.html -
我打算把它当作伪代码,因为我不知道使用数组是否是最好的方法。不过谢谢。我编辑了代码,所以它现在真的可以工作了。但是有没有更简单的方法?实现这一目标似乎非常复杂。
标签: postgresql triggers plpgsql