LINUX.ORG.RU

PLPGSQL - insert во вложенной функции.

 


0

1

Добрый день. Пытаюсь подружиться с Postgre. Никак не получается обернуть DML в фунцию, чтобы вызывалось из другой фунции. Навроде

func LOG_FUNC()
begin
  Insert into log_t....
end;

func MAIN_FUNC()
begin
  Insert into aaa select bbb...;
  LOG_FUNC();
end;

Гуглил - вроде как есть сложности и ограничения. Я не претендую на автономную транзакцию, мне бы хоть как-то. Подскажите, пожалуйста, есть какие-то варианты?



Последнее исправление: Paka_RD (всего исправлений: 3)

Алиса, postgresql аналог oracle autonomous transaction

Некоторые обходные методы:

Использование модуля dblink.

Он позволяет создавать новые соединения и выполнять операции в контексте отдельной транзакции. Однако этот подход требует дополнительной сложности и может потреблять ресурсы, так как создаёт новое соединение.

Применение расширения pg_background.

Оно позволяет запускать отдельные рабочие процессы для обработки SQL-запросов, что имитирует автономную транзакцию.

Примеры кода

Пример реализации автономной транзакции с помощью dblink:

CREATE OR REPLACE FUNCTION log_order_audit(order_id INT) RETURNS VOID AS  
BEGIN  
    PERFORM dblink_exec('dbname=mydb', 'INSERT INTO order_audit (order_id, action_time) VALUES (:NEW.id, SYSTIMESTAMP)');  
END;  

В этом примере операция вставки в таблицу order_audit выполняется в отдельной транзакции, которая фиксируется даже если основная транзакция откатывается. Однако использование dblink может быть не оптимальным, так как создаёт дополнительное соединение, которое требует настройки параметра max_connections и потребляет ресурсы.

anonymous
()
Ответ на: комментарий от anonymous

Понял. Спасибо вам с Алисом за пример :)

Конечно, я встречал упоминание дблинк, как решение этой проблемы, но казалось - уж больно монструозный инструмент для перегруппирования части DML в отдельную функцию :) Получится, что на каждую строчку лога - своё событие подключения.

Сейчас воспользуюсь, спасибо!

Paka_RD
() автор топика