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