Postgres: log_statement = 'none' игнорируется, когда запрос приходит из C ++ - PullRequest
0 голосов
/ 08 апреля 2020

Я заблокирован следующей проблемой.

log_statement postgres на сервере имеет значение ddl (или все). База данных создана моим приложением, написанным на C ++. Запросы отправляются в БД с использованием libpq - PQexe c.

Каждый запрос регистрируется дважды, я не знаю почему (я не программист 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), я получаю желаемый результат, в журнал заносится только один журнал, содержащий УДАЛЕНО вместо пароля:

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>

Кто-нибудь знает, как отключить первый журнал? Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

SET LOCAL область действия только для текущей транзакции.

Попробуйте:

  1. Либо запустить SET log_statement=none, который сохраняется во время сеанса базы данных, если не выдан ROLLBACK.
  2. , либо запустить SET LOCAL log_statement=none для каждой транзакции.

Похоже, код C ++ устанавливает параметр log_statement: лучшим решением должно быть его удаление, так как он уже использует другую запись в журнал.

0 голосов
/ 09 апреля 2020

Вы отправляете PostgreSQL единственное «заявление», которое содержит 4 фактических заявления. Ко времени обработки «SET LOCAL log_statement = 'none” »ущерб уже нанесен, так как весь оператор с несколькими утверждениями уже зарегистрирован. Вам нужно отправлять каждый оператор отдельно, если вы хотите, чтобы его часть влияла на настройки для другой его части.

В качестве альтернативы, просто избегайте установки для log_statement значения 'all', как кажется быть ненужным.

...