gpt4 book ai didi

postgresql - 数据库中的触发器在 “set” 插入语句之后执行

转载 作者:行者123 更新时间:2023-11-29 11:19:37 24 4
gpt4 key购买 nike

我有一个存储事件的表。

但是,按照系统的设计方式,事件通常是成批记录的。我的意思是,通常会一起记录一组事件(大约 10 个),而不是单个事件。

我们可以假设:在事件表中有一列名为“batch_no”,因此我们知道哪些事件属于哪个批号。

问题:我想做的是在每次一批事件完成加载到表中时执行一个触发函数。然而,问题是我想不出触发器如何知道这一点,而不只是为 every 行调用函数。

我一直在考虑的解决方案包括:(a) 为每一行定义一个触发器; (b) 在计算计数的条件下(select * from events, where NEW.batchNO = events.batchNO);耽误一些时间;再次计算相同的计数,如果它们相等,我们就知道该批处理已完成加载,我们调用触发器。

虽然,上面的解决方案显然听起来很复杂?有更好或更简单的解决方案吗? (或者,如果没有,对我如何实现我所描述的内容有什么帮助吗?)

最佳答案

可以将参数传递给触发器函数,但只能在 CREATE TRIGGER 语句中,这有助于为多个触发器使用相同的触发器函数,但 不会帮助您解决问题。

您需要触发器在创建触发器时未知的条件下触发。我基本上看到了三种可能性:

1)语句级触发器

使用 FOR EACH STATEMENT 子句。 The manual:

A trigger that is marked FOR EACH ROW is called once for every rowthat the operation modifies. For example, a DELETE that affects 10rows will cause any ON DELETE triggers on the target relation to becalled 10 separate times, once for each deleted row. In contrast, atrigger that is marked FOR EACH STATEMENT only executes once for anygiven operation, regardless of how many rows it modifies (inparticular, an operation that modifies zero rows will still result inthe execution of any applicable FOR EACH STATEMENT triggers).

仅当您使用单个 INSERT 命令(多行)插入所有批处理时才适用,但一次不超过一个批处理。

2) WHEN 行级触发器的条件。

使用 FOR EACH ROW 子句加上 WHEN 条件。为此,您需要 9.0+ 版本。
如果您可以从单个插入的行(这是一批中的最后一行)中分辨出来,那么您的触发器定义可能如下所示:

CREATE TRIGGER insert_after_batch
AFTER INSERT ON tbl
FOR EACH ROW
WHEN (NEW.batch_last) -- any expression identifying the last
EXECUTE PROCEDURE trg_tbl_insert_after_batch();

这假定您的表中有一列 batch_last boolean,您可以在其中标记批处理的最后一行。任何基于列值的表达式都是可能的。

这样触发器只会在每个批处理的最后一行触发。使它成为一个 AFTER 触发器,这样所有行都已经在表中可见,并且您可以一起查询它们以了解您想在触发器中执行的任何操作。 可能是要走的路。

3) 触发器中的条件代码

这基本上是 9.0 之前版本的回退,没有 WHEN 子句。在执行负载之前在触发器内部进行相同的检查。比 2) 贵。

关于postgresql - 数据库中的触发器在 “set” 插入语句之后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com