有没有一种好的方法可以为postgres表中的每个记录运行触发器?


22

我有一个无法控制某些表设计的系统(通过Slony-I复制),所以我有一系列我们称为“影子表”的系统,在其中我从复制表中提取了一些信息,并将其存储在所需的已处理表单中,同时去除要忽略的记录。

现在,设置新副本后,我运行更新并将其值设置回自身(例如UPDATE tablename SET field=field),以强制触发器运行,但是其中一些表是数百万条记录,并且在增长,并且可能需要30分钟。(然后还有真空)。

有没有更好的方法来触发它,或者有某种方式编写一个函数以使其能够与传入的输入或NEW依赖于调用上下文一起工作?我不愿意保留两个不同的功能,因为我已经看到太多次更新了一个功能,而另一个没有更新。


我知道如何运行触发器...我问是否有一个好的方法。

Answers:


19

可以使用以下模板完成:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

h ...我一直在向后思考(试图使触发器函数可以由某个过程调用,而不是反过来)。

1
当我真正做到这一点时,我意识到“行”是一个保留字,因此我更正了该示例,因此其他人将不必花费很长时间进行调试。

1
我真的应该在多年前跟进。我花了好一会儿时间才设法在系统中正常工作……这种方法行得通,但是性能却很糟糕。(从30分钟到一天多才完成)。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.