postgresql:从视图中删除

aro*_*rod 5 postgresql trigger view postgresql-9.4

在 Postgresql 9.4 中,我们将视图作为表 A 和 B 的联合进行处理,并且当我们“删除”底层表中的记录时(通过 aa 触发器上的看法)。

这里有更详细的信息。我们的观点看起来像,

A
--
id, name
1, afoo
2, abar

B
--
id, name
3, bfoo
4, bbar
Run Code Online (Sandbox Code Playgroud)

所以我们的视图 C 看起来像

C
--
1, afoo
2, abar
3, bfoo
4, bbar
Run Code Online (Sandbox Code Playgroud)

我们做了一个CREATE TRIGGER delete_trigger INSTEAD OF DELETE C FOR EACH ROW DO delete_trigger(),它通过 id 删除行,这基本上就像

-- our function trigger():
$$
delete from A where id=old.id;
GET DIAGNOSTICS deletedA = ROW_COUNT;

delete from B where id=old.id;
GET DIAGNOSTICS deletedB = ROW_COUNT;

raise notice 'deleted % records from A, % records from B', deletedA , deletedB;

$$
Run Code Online (Sandbox Code Playgroud)

如果我们发出类似 的命令delete * from C;,我们的理想目标是有一条消息说

deleted 2 records from A, 2 records from B
Run Code Online (Sandbox Code Playgroud)

但相反,我们有 - 因为我们不知道更好 -,

deleted 1 records from A, 0 records from B 
deleted 1 records from A, 0 records from B 
deleted 0 records from A, 1 records from B 
deleted 0 records from A, 0 records from B 
Run Code Online (Sandbox Code Playgroud)

是否可以获得单个已删除记录的总和?

我们也很担心这方面的表现。

任何和所有的帮助都非常感谢!

小智 2

为每一行调用触发的事件。

语法是

CREATE TRIGGER c_view_delete_trg INSTEAD OF DELETE ON c_view FOR EACH ROW EXECUTE PROCEDURE c_view_delete();

这意味着对于要删除的每一行都会调用该函数一次。这就是为什么它每次打印一行。