триггер для тихого прерывания вставки в таблицу

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

CREATE TRIGGER control_tr AFTER INSERT ON tableFoo
FOR EACH ROW
EXECUTE PROCEDURE control_tr_fun();

CREATE OR REPLACE FUNCTION control_tr_fun() RETURNS TRIGGER AS $$
BEGIN
    IF (NOT condition_is_met(NEW.a, NEW.b, NEW.c)) THEN
        DO NOTHING INSTEAD OF INSERT // syntax I am hoping for instead of RAISE EXCEPTION
    ELSE
        RETURN NEW;
    END IF;
END
$$ LANGUAGE plpgsql;

Я ценю то, что могу попросить клиентскую библиотеку вызвать функцию PL / pgSQL или создать триггер, который RAISEs исключение, и попросить клиентскую библиотеку перехватить исключение (если оно возникло) и просто проигнорировать его, но я ищу способ реализовать это максимально прозрачно для клиента.


person Marcus Junius Brutus    schedule 27.11.2014    source источник
comment
Очень похоже: stackoverflow.com/questions / 22733254 /   -  person Erwin Brandstetter    schedule 27.11.2014


Ответы (1)


Если вы RETURN NULL, тогда ничего не произойдет, INSERT тихо выйдет из строя. Но вам нужно определить триггер как BEFORE INSERT, а не AFTER INSERT, как в вашем примере.

Если вы RAISE EXCEPTION, то вся транзакция завершится неудачно.

Вы также можете RAISE NOTICE, не прерывая транзакцию, и поймать ее в клиентской библиотеке, но только если это было последнее уведомление. Вы не можете складывать уведомления.

person Kouber Saparev    schedule 27.11.2014