这个问题是对这个question的一种跟进,但它与主题的不同之处在于我觉得它值得自己讨论。对于一些背景知识,您可以参考它。
作为新文件导入系统的一部分,我正在构建一个基于此wiki page的审计系统。但是,我想在审计跟踪中包含的一件事是数据来自的文件的文件名(这些文件是为长期存储而存档的,所以如果有问题,我总是可以回去)。
我可以采用的一种方法是创建一个import_batch记录并在那里记录文件的名称,然后在更新时记录记录。这是我要走的路。但是,在某种程度上感觉有点笨拙。我一直在思考试图使审计触发器能够获得import_batch_id而不必在NEW。*记录中的想法。在我看来,至少有几种方法可以实现这一目标。
我可以创建一个可以创建临时表并在其中存储我想要的任何信息的函数(例如批处理#或文件名或其他)。这看起来很干净,据我所知它只会在交易期间存在。据我了解,它不必担心命名冲突。每个事务都有一个名为“tmp_import_info”的临时文件。
如果我只关心import_batch_id(有一个seq),我可能只是得到了音序器的当前值。我不是100%确定这在多用户设置中会如何表现。我认为trans#1可以创建import_batch_id#222然后trans#2来启动并获得#223。然后我的审计线索会记录错误的数据。
我还有其他选择吗?有没有办法添加事务/会话变量?基本上,类似于pg_settings(但是,它允许插入,更新和删除值)。
感觉最好的选择可能是临时表。
答案 0 :(得分:1)
变体2。的主要好消息是 - 引用the manual here:
currval
返回当前会话中此序列的
nextval
最近获得的值。 (如果在此会话中从未为此序列调用nextval
,则会报告错误。)因为这会返回会话本地值,所以无论其他会话是否已执行nextval
,都会给出可预测的答案自本届会议以来。
将导入文件名存储在包含 serial
主键的表格中。您可以使用currval
或lastval
从序列中引用您的最后一个值。 并发用户不能干涉。只要您不自己在自己的交易中填写此路径,这是安全的。