postgresql - 如何将plpgsql中的查询错误保存到表中?

标签 postgresql logging error-handling transactions plpgsql

我需要将错误代码 (SQLSTATE) 和 INSERT 或 UPDATE 返回的错误消息 (SQLERRM) 保存在一个表中。我的过程必须执行一个 INSERT,如果发生错误,它必须保存到一个适当的表中。

但问题是,如果我使用 EXCEPTION block ,当发生错误时,事务将中止并且之后的任何命令都无法执行。

如何使用 PLPGSQL 将查询返回的错误保存到表中?

最佳答案

有两种可能的解决方案:

  1. 使用 CSV 格式的 PostgreSQL 日志。稍后您可以通过\copy 语句将 pg 日志导入到表中。如果可能,首选这种方式,因为它对性能的负面影响最小。

  2. 您可以通过更多技术模拟自主交易

    • PostgreSQL 数据库链接
    • PostgreSQL FDW 驱动程序

dblink 的示例基于仿真(Jon Roberts 和我):

CREATE OR REPLACE FUNCTION fn_log_error(_function varchar,
                                        _location int, _error varchar) 
RETURNS void AS $$
DECLARE
  _sql varchar;
  _exec_error varchar;
BEGIN
  PERFORM dblink_connect('autonom_connection', 'dbname=...'); 

  _sql := format('INSERT INTO error_log (function_name, location,
                    error_message, error_time) VALUES (%L, %s, %L, %L)',
           _function, _location, _error, clock_timestamp());

  PERFORM dblink_exec('autonom_connection', _sql, false);
  _exec_error := dblink_error_message('autonom_connection');

  IF position('ERROR' in _exec_error) > 0 
      OR position('WARNING' in _exec_error) > 0 THEN
    RAISE EXCEPTION '%', _exec_error;
  END IF;

  PERFORM dblink_disconnect('autonom_connection');
EXCEPTION
   WHEN others THEN
     PERFORM dblink_disconnect('autonom_connection');
     RAISE EXCEPTION '(%)', SQLERRM;
END;
$$ LANGUAGE plpgsql;

其他一些例子:

关于postgresql - 如何将plpgsql中的查询错误保存到表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190731/

相关文章:

python - 为复杂查询正确索引大型时间序列数据集

sql - 将数据移动到另一个表

sql - 在 postgres 查询中使用 ANY 时,有没有办法保留顺序或数组?

Apache Camel MDC 从 Body 添加字段

java - 使用日期进行文件命名的标准文件记录器?

r - Boxplot中的图边距为大(带有可复制代码)

postgresql - 导入到 postgres 时从 CSV 中删除封闭的双括号

php - laravel 5.2 不同任务的自定义日志文件

xml - 我应该如何使用 XML::Simple 处理 undefined reference ?

android-studio - 为什么即使我已经在其中明确使用了变量,android studio也会对未使用的变量给出警告