Lar*_*rry 8 postgresql triggers
我有一张存储活动的桌子.
但是,系统的设计方式通常是分批记录事件.我的意思是,一组事件(大约10个)通常一起记录,而不仅仅是单个事件.
我们可以假设:事件表中有一个名为"batch_no"的列,因此我们知道哪些事件属于哪个批处理.
问题:我想要做的是每次一批事件加载到表时执行触发器功能.然而,问题是我无法想到触发器将如何知道这一点,而不仅仅是为每一行调用函数.
我一直在考虑的解决方案包括:(a)为每一行定义一个触发器; (b)在计算计数的条件下(从事件中选择*,其中NEW.batchNO = events.batchNO); 延迟一段时间; 再次计算相同的计数,如果它们相等,我们知道批次已完成加载,我们调用触发器.
虽然,上面的解决方案显然很复杂吗?有更好或更简单的解决方案吗?(或者,如果没有,对我如何实现我所描述的内容有任何帮助?)
您可以将参数传递给触发器函数,但仅限于CREATE触发器语句,这有助于对许多表使用相同的触发器函数,但对您的情况没有帮助.
您需要触发器在触发器创建时未知的条件上触发.我基本上看到三种可能性:
使用该FOR EACH STATEMENT
条款.我在这里引用手册:
标记为FOR EACH STATEMENT的触发器仅对任何给定的操作执行一次,无论它修改了多少行(特别是,修改零行的操作仍将导致执行任何适用的FOR EACH STATEMENT触发器).
仅适用于使用单个INSERT命令(多行)插入所有批次,但一次不能多于一个批次.
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
触发器,因此所有行都已在表中可见,您可以一起查询它们,以便在触发器中执行任何操作.可能是要走的路.
这基本上是9.0之前的版本的后备,你还没有WHEN条件.在执行有效负载之前,在触发器内执行相同的检查.比WHEN条件更昂贵.
归档时间: |
|
查看次数: |
2926 次 |
最近记录: |