我有问题,而不是更新规则与多个查询在Postgres-目前的版本9.2.4,但我想我也有类似的问题与以前的版本。我有一个包含三个查询(插入/更新)的规则,其中一些查询有时不执行。这似乎取决于这些查询的顺序。不幸的是,它真的很难调试,因为它有时工作良好。我在官方文件中没有发现任何限制。
我有三个表(A、B和AB),其中A和B包含数据以及一些“标记”和“标记”的时间戳。表AB仅包含A和B之间的关系,但不幸的是,仅包含A和B中的一些数据。标记意味着数据已由操作员验证,并且它们是正常的,标记的原因有很多,其中一个是A和B中的数据匹配。(我知道模式并不理想,但我无法修改)。
我有视图视图A B,它试图将数据从A匹配到B,该视图有一个规则:

CREATE RULE view_AB_rl AS ON UPDATE TO public.view_AB
DO INSTEAD (
 INSERT INTO AB (keyA,keyB) VALUES (new.keyA, new.keyB);
 UPDATE B SET tag = new.tag,
    taggingTS = LEAST(now(), ( SELECT B.taggingTS FROM B WHERE b.keyB=new.keyB))
  WHERE b.keyB=new.keyB;
UPDATE A SET tag = new.tag, taggingTS = now()  WHERE A.keyA = new.keyA;
 );

其思想是,操作员执行SELECT*from view_AB(通常带有附加的筛选条件),检查配对是否正常,并更新view_AB SET tag='something'(使用相同的筛选条件)。规则应将数据分发到A、B和AB中,并应更新表A和B中的标记(在B中,如果标记已经存在,则不应更改标记)。
虽然有时它的工作方式与应该的完全一样,但有时它只执行前两个查询。基本上,它将绑定记录插入AB,更新B标记和标记,但根本不更新A。。。当然,当数据失去同步时,这些问题会导致很多问题。。。
我正在考虑将其更改为触发器,因为它似乎也是一个可行的选择,但首先,我想至少了解为什么规则方法不起作用。我喜欢这样的想法:我创建一个视图作为数据的组合,并创建一个规则来将更改分发回底层数据,而触发器则更为“如果某些更改做了额外的事情”。。。

最佳答案

我把它改成了规则和触发器的组合,现在它似乎可以工作了——至少我还没有发现任何数据不同步,就像我在只使用规则的方法中所做的那样。
这样做的目的是保持更新AB表的查询:

CREATE RULE view_AB_rl AS ON UPDATE TO public.view_AB
DO INSTEAD (
    INSERT INTO AB (keyA,keyB,tag) VALUES (new.keyA, new.keyB,tag);
)

不幸的是,这意味着我必须将tag字段添加到AB表中。
然后在AB上有一个触发器(在每一行之后),它基本上完成剩下的两个查询。

关于sql - PostgreSQL而不是带有多个查询的更新规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25743657/

10-16 07:45