Postgres:当查询来自C++时,log_statement = 'none'将被忽略



我被以下问题阻止了。

服务器上postgres的log_statement设置为ddl(或全部(。数据库是由我的应用程序创建的,它是用C++编写的。查询通过使用libpq-PQexec发送到DB。

每个查询都被记录两次,我不知道为什么(我不是C++程序员,也不是postgres专家(:

Apr  3 02:26:44 xxx postgres[12345]: [8-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG:  statement: CREATE USER "gingillo" WITH PASSWORD 'giggio';
Apr  3 02:26:44 xxx postgres[12345]: [9-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG:  AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>

正如你已经想象的那样,我不想记录密码,所以我更改了当前的查询(1(:

CREATE USER "gingillo" WITH PASSWORD 'giggio'

如下(2(:

BEGIN;SET LOCAL log_statement = 'none';CREATE USER "gingillo" WITH PASSWORD 'giggio';COMMIT;

如果我手动运行查询(2(,我会得到我想要的结果,只记录一个包含REDACTED而不是密码的日志:

Apr  3 02:26:44 xxx postgres[12345]: [9-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG:  AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>

但是,当C++运行同一个查询时,我有两个日志,甚至显示log_statement内容:

Apr  8 06:44:24 xxx postgres[27171]: [8-1] [2020-04-08 06:44:24.489 CDT] [s:xxx.6a23] [u:user] [a:[unknown]] [db:postgres] [p:27171] [clnt:[local]] LOG:  statement: BEGIN;SET LOCAL log_statement = 'none';CREATE USER "gingillo" WITH PASSWORD 'giggio';COMMIT;
Apr  8 06:44:24 xxx postgres[27171]: [9-1] [2020-04-08 06:44:24.490 CDT] [s:xxx.6a23] [u:user] [a:[unknown]] [db:postgres] [p:27171] [clnt:[local]] LOG:  AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"BEGIN;SET LOCAL log_statement = 'none';CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>

有人知道如何禁用第一个日志吗?我做错了什么?

SET LOCAL作用域仅用于当前事务。

尝试:

  1. 要么运行在数据库会话期间持续存在的SET log_statement=none,除非发出ROLLBACK
  2. 或者为每个事务运行CCD_ 3

看起来C++代码正在设置log_statement参数:最好的解决方案应该是删除它,因为它已经使用了另一个日志记录。

您正在向PostgreSQL发送一个包含4个实际语句的单个"语句"。当处理"SET LOCAL log_statement='none'"时,由于已经记录了整个多语句语句,因此损坏已经造成。如果你想让其中的一部分影响另一部分的设置,你需要单独发送每个语句。

或者,一开始就避免将log_statement设置为"all",因为这似乎是不必要的。

相关内容

  • 没有找到相关文章

最新更新