首页 文章

PostgreSQL事务变量

提问于
浏览
2

这个问题是对这个问题的一种跟进,但是它自己也在进行讨论 . 对于一些背景知识,您可以参考它 .

作为新文件导入系统的一部分,我正在构建一个基于此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(但是,它允许插入,更新和删除值) .

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

1 回答

  • 1

    variant 2. 的主要好消息是 - 引用the manual here

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

    将导入文件名存储在带有 serial primary key 的表中 . 您可以使用 currvallastval 来引用序列中的最后一个值 . Concurrent users cannot interfere. 只要您不自己在自己的交易中填写此路径,这是安全的 .

相关问题