как правильно предотвратить задержки после вставки триггеров, которые пытаются вставить данные во внешние таблицы, которые недоступны - PullRequest
1 голос
/ 30 октября 2019

Я использую PostgreSQL 11.

Я использую расширение postgres_fdw для вставки строк в таблицу на другом сервере.

Итак, я создал чужую таблицу .. Давайте назовем ее foo, и у меня есть триггер AFTER INSERT, который выполняет функцию, которая вставляет эту строку во внешнюю таблицу на настроенном удаленном сервере.

Если сервер не отвечает, триггер останавливается до истечения времени ожидания.

Итак, у меня есть несколько вопросов относительно этой проблемы:

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

  2. может ли система проверить действительность этого сервера и, если она не может подключиться, пометить его на пару минут, чтобы он даже не пыталсяотправить на него вставки?

Обычно вставки отправляются на резервный сервер, если сервер не отвечает или требуется слишком много времени, чтобы ответить, он не должен иметь никакихвлияет на клиента.

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

Как я могу реализовать такую ​​вещь?

Я создам пример кода, чтобы вы поняли, что я делаю.

Скажем, foo - моя чужая таблица.

CREATE OR REPLACE FUNCTION after_insert() RETURNS TRIGGER AS $after_insert$
DECLARE
    res BOOL;
BEGIN
    INSERT INTO foo(bar1,bar2,bar3) values(foo1,foo2,foo3);
    EXCEPTION WHEN OTHERS THEN  raise NOTICE '% %', sqlstate, sqlerrm;
    RETURN NEW;
END;
$after_insert$ LANGUAGE plpgsql;


CREATE TRIGGER after_insert AFTER INSERT
    ON my_table FOR EACH ROW EXECUTE PROCEDURE after_insert();

1 Ответ

0 голосов
/ 14 ноября 2019

Я понял, что использование after insert триггеров для добавления сложных данных в другие таблицы - плохая практика. я хочу, чтобы строка была вставлена ​​даже в случае сбоя триггера после, и я действительно не хотела, чтобы триггер после вставки задерживал вставку.

так что это был не тот путь!

Вместо этого я создал задание cron, которое запускается в новых строках каждые пару минут.

Теперь, после многих исследований, я понимаю, что, если какие-либо триггеры, которые я хочу создать, на самом деле не влияютстрока, которую я вставляю и не должна задерживать это .. я не должен использовать триггеры. что сейчас звучит очень разумно:)

спасибо вам всем! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...