【问题标题】:PostgreSQL transaction variablesPostgreSQL 事务变量
【发布时间】:2012-09-21 20:19:56
【问题描述】:

这个问题有点像question 的后续问题,但它与一个主题不同,我觉得它值得自己讨论。有一点背景可以参考一下。

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

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

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

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

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

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

【问题讨论】:

    标签: postgresql concurrency transactions postgresql-9.1


    【解决方案1】:

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

    currval

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

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

    【讨论】:

    • 好的。说得通。由于它在审计触发器上,因此有可能在常规导入的上下文之外进行编辑(也就是通过来自 pgAdminIII 的脚本)。在这种情况下,我可能只捕获 SQLSTATE '55000'。我在 pgAdminIII 会话中运行一个影响 import_batch 表的脚本的人有轻微的风险......但是,感觉就像我可以忍受的风险/弱点。
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2016-03-29
    • 2019-06-07
    • 2015-06-04
    • 1970-01-01
    • 2012-06-02
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多