【问题标题】:Reduce bothering notices in plpgsql减少 plpgsql 中的烦人通知
【发布时间】:2015-02-19 17:18:54
【问题描述】:

我有一个使用临时表的函数,如果存在则必须删除它。

drop table if exists t_xy;
create temp table t_xy on commit drop as select ...;

随后我在视图中使用此功能。该函数在选择过程中被多次调用。我喜欢使用“引发通知”命令,因为它几乎是报告函数中任何变量以进行调试的唯一可靠方法。问题是我必须在大量不需要的行中搜索它们,例如:

注意:表“t_xy”不存在,正在跳过 上下文:SQL 语句“如果存在 t_xy,则删除表” SQL 命令中的 PL/pgSQL 函数 f_pending_operations(uuid) line5

有没有办法抑制不是由raise notice 命令生成的通知,而是由drop table if exists 或删除其他对象生成的通知?将 'client_min_messages' 选项设置为 'debug' 会使问题变得更糟。

【问题讨论】:

    标签: postgresql debugging plpgsql notice


    【解决方案1】:

    您可以使用本地设置为client_min_messages 的任何命令将通知静音:

    SET LOCAL client_min_messages=warning;  -- "debug" would have opposite effect
    DROP TABLE if exists t_xy;
    RESET client_min_messages=warning;  -- may or may not be needed
    

    Per documentation:

    SET LOCAL 的效果只持续到当前事务结束

    如果您不发出RESET,您实际上会在交易的其余部分使通知静音。

    或者,您也可以从命令行为每次调用设置client_min_messages

    【讨论】:

    • 除此之外,与为每次调用视图创建临时表相比,可能有(很多)更好的解决方案。我建议您开始一个新问题,其中包含所有详细信息以供您查看。我在黑暗中的第一枪,将是 CTE ...
    • 事实上我只需要临时表来进行调试。我在其中收集了另一个数据,以便通过从 t_xy 中选择 * 进行后续打印。所以我可以在生产模式下删除它。
    【解决方案2】:

    您还可以使用 GUC 参数减少消息的详细程度:

    set log_error_verbosity='terse';

    当然可以在功能层面设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多