【发布时间】:2012-09-21 20:19:56
【问题描述】:
这个问题有点像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 的东西(但是,它确实允许插入、更新和删除值)。
感觉最好的选择可能是临时表。
【问题讨论】:
标签: postgresql concurrency transactions postgresql-9.1