2

这个问题是对这个问题的一种跟进,但它与一个话题不同,我觉得它值得自己讨论。对于一些背景,您可以参考它。

作为新文件导入系统的一部分,我正在构建一个基于此 wiki页面的审核系统。但是,我想在审计跟踪中包含的一件事是数据来自的文件的文件名(这些文件被存档以进行长期存储,所以如果有问题,我可以随时返回)。

我可以采用的一种方法是创建一个 import_batch 记录并在那里记录文件的名称,然后在记录更新时标记记录。这是我要走的路。但是,它在某种程度上感觉有点笨拙。我一直在考虑尝试让审计触发器能够获取 import_batch_id 而不必在 NEW.* 记录中的想法。在我看来,至少有几种方法可以做到这一点。

  1. 我可以有一个函数可以创建一个临时表并在其中存储我想要的任何信息(例如批处理#或文件名或其他)。这看起来很干净,据我所知,它只会在交易期间有效。据我了解,它不必担心命名冲突。每个事务都有一个名为“tmp_import_info”的临时文件。

  2. 如果我只关心 import_batch_id (它有一个序列),我可能只需要得到序列器的当前值。我不是 100% 确定这在多用户设置中会如何表现。我认为 trans#1 可以创建 import_batch_id #222,然后 trans#2 开始并获取 #223。然后我的审计跟踪会记录错误的数据。

还有其他我在这里看不到的选项吗?有没有办法添加事务/会话变量?基本上,类似 pg_settings 的东西(但是,它确实允许插入、更新和删除值)。

感觉最好的选择可能是临时表。

4

1 回答 1

1

变体 2.的主要好消息是 - 在此处引用手册

currval

nextval返回当前会话中此序列最近获得的值。(如果nextval在此会话中从未为此序列调用过,则会报告错误。)因为这将返回一个会话本地值,所以它给出了一个可预测的答案,即nextval自当前会话以来其他会话是否已执行。

将您的导入文件名存储在具有serial主键的表中。您可以使用或引用序列中最后一个值。并发用户不能干涉。只要您不自己在自己的交易中挫败这条路径,这是安全的。currvallastval

于 2012-09-21T21:54:23.533 回答