Как я вижу триггерные функции в файлах журнала - PullRequest
2 голосов
/ 17 марта 2020

У меня есть таблица charass, в этой таблице у меня есть триггер

CREATE TRIGGER charassheattrigger
    BEFORE INSERT OR UPDATE 
    ON public.charass
    FOR EACH ROW
    EXECUTE PROCEDURE public._charassheattrigger();

Функция, выполняемая этим триггером, выглядит как

CREATE OR REPLACE FUNCTION public._charassheattrigger()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE
AS $BODY$

BEGIN

  IF (TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND OLD.charass_value <> NEW.charass_value)) AND NEW.charass_char_id = 34 THEN
    IF NOT EXISTS(SELECT true FROM heat WHERE heat_number = NEW.charass_value) THEN
      INSERT INTO heat (heat_number,heat_created,heat_vend_id) 
        SELECT NEW.charass_value,NOW(), order_vend_id
        FROM ls
        JOIN detail ON (ls_id = detail_ls_id)
        JOIN hist ON (detail_hist_id = hist_id)
        JOIN order ON (hist_order_id = order_id)
        WHERE hist_ordtype = 'PO' AND hist_transtype = 'RP' AND ls_id = NEW.charass_target_id;
    END IF;
  END IF;  

  RETURN NEW;
END;
$BODY$;

Когда я смотрю на файл журнала , Я вижу выполненное выражение

statement: INSERT INTO charass (charass_value, charass_target_type, charass_target_id, charass_char_id) VALUES ('123456789', 'LS', 1234, 34)

Я проверяю таблицу тепловых потоков, ожидающую увидеть запись с параметром heat_number, как «123456789», но в таблице тепловых режимов ничего нет.

Итак, я открываю pg admin, копирую приведенную выше инструкцию и выполняю ее вручную. Теперь есть запись в таблице тепла.

В чем разница между ручной вставкой и той, которую выполняет приложение. Есть ли способ сказать? имя пользователя, стоящее за оператором, одинаково, поэтому оно не может быть разрешением. Мне было интересно, есть ли способ отправить информацию из функции триггера в файл журнала, чтобы я мог просмотреть ее

1 Ответ

0 голосов
/ 17 марта 2020

Добавьте auto_explain к shared_preload_libraries в postgresql.conf, а также эти дополнительные параметры:

auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 0

Затем перезапустите PostgreSQL.

Теперь вы получите инструкции внутри функция регистрируется вместе с планом их выполнения.

...