DB中的触发器在插入语句的"set"之后执行

Lar*_*rry 8 postgresql triggers

我有一张存储活动的桌子.

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

我们可以假设:事件表中有一个名为"batch_no"的列,因此我们知道哪些事件属于哪个批处理.

问题:我想要做的是每次一批事件加载到表时执行触发器功能.然而,问题是我无法想到触发器将如何知道这一点,而不仅仅是为每一行调用函数.

我一直在考虑的解决方案包括:(a)为每一行定义一个触发器; (b)在计算计数的条件下(从事件中选择*,其中NEW.batchNO = events.batchNO); 延迟一段时间; 再次计算相同的计数,如果它们相等,我们知道批次已完成加载,我们调用触发器.

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

Erw*_*ter 7

可以将参数传递给触发器函数,但仅限于CREATE触发器语句,这有助于对许多表使用相同的触发器函数,但对您的情况没有帮助.

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

1)语句级触发器

使用该FOR EACH STATEMENT条款.我在这里引用手册:

标记为FOR EACH STATEMENT的触发器仅对任何给定的操作执行一次,无论它修改了多少行(特别是,修改零行的操作仍将导致执行任何适用的FOR EACH STATEMENT触发器).

仅适用于使用单个INSERT命令(多行)插入所有批次,但一次不能多于一个批次.

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

使用FOR EACH STATEMENT条款加上WHEN条件.你需要版本9.0+.
如果您可以从单个插入的行(即批处理的最后一行)中分辨出来,那么您的触发器定义可能如下所示:

CREATE TRIGGER insert_after_batch
AFTER INSERT ON tbl
FOR EACH ROW
WHEN (NEW.batch_last)
EXECUTE PROCEDURE trg_tbl_insert_after_batch();
Run Code Online (Sandbox Code Playgroud)

我假设batch_last boolean您的表中有一列,您在其中标记批次的最后一行.任何其他方法都是可能的.

这样,触发器仅触发每个批次的最后一行.使它成为一个AFTER触发器,因此所有行都已在表中可见,您可以一起查询它们,以便在触发器中执行任何操作.可能是要走的路.

3)触发器内的条件代码

这基本上是9.0之前的版本的后备,你还没有WHEN条件.在执行有效负载之前,在触发器内执行相同的检查.比WHEN条件更昂贵.