#sql #postgresql #function #triggers
Вопрос:
Я хочу создать триггер, в котором при выполнении определенного условия для вставки новой таблицы будут обновлены как вставляемая таблица, так и соответствующая таблица. Я хочу, чтобы эти таблицы сначала были очищены, а затем повторно заполнены с помощью указанных мной функций. До сих пор у меня есть это
CREATE FUNCTION test_fxn() RETURNS TRIGGER AS $test_fxn$ BEGIN IF NEW.variable2 gt; x IS TRUE THEN RAISE EXCEPTION 'too long'; END IF; IF NEW.variable2 lt; x IS TRUE THEN INSERT INTO summary_table (variable1, variable2) VALUES (NEW.variable1, NEW.variable2); RAISE EXCEPTION 'correct'; END IF; END; $test_fxn$ LANGUAGE plpgsql; CREATE TRIGGER test_fxn BEFORE INSERT OR UPDATE ON detailed_table FOR EACH ROW EXECUTE PROCEDURE test_fxn();
Несмотря на появляющиеся исключения, вновь вставленная строка не копируется в таблицу summary_table, как мне бы хотелось. Кроме того, похоже, что он также не отображается в таблице detailed_table, однако удаление инструкции INSERT INTO и выполнение с помощью триггера вызовет исключения и будет выполняться как обычно. Любые советы по исправлению этого будут оценены по достоинству.
Комментарии:
1. Триггеры сильно зависят от поставщика, поэтому, пожалуйста , добавьте тег, чтобы указать, используете ли вы
mysql
,postgresql
,sql-server
,oracle
илиdb2
-или что — то совсем другое.2. Вам не хватает a
return new;
в вашей функции триггера. ВСТАВКА или ОБНОВЛЕНИЕ должны привести к ошибке » контроль достиг конца процедуры запуска без ВОЗВРАТА «.3. » Несмотря на появляющиеся исключения, вновь вставленная строка не копируется в таблицу summary_table, как мне бы хотелось » — вставка внутри вашего триггера является частью той же транзакции, которая запустила триггер. Исключение заставляет эту транзакцию откатываться, включая вставку в
summary_table
. Вы ищете «автономную транзакцию», которая на самом деле не поддерживается в Postgres. Найдите на этом сайте «автономную транзакцию» и postgres — есть обходные пути, например, с помощьюdblink
модуля
Ответ №1:
Ваша проблема в том RAISE EXCEPTION 'correct';
. Исключение вызывает ошибку в PostgreSQL, и эта ошибка приводит к откату всей транзакции, включая эффекты триггера.
Используйте RAISE NOTICE
для информационных сообщений клиенту.
Комментарии:
1. Я добавил RETURN NEW и изменил исключения для уведомлений, но информация по-прежнему не вставляется в таблицу summary_table, как ожидалось. Есть ли какое-либо дальнейшее решение этой проблемы?
2. Если уведомление будет показано, вставка будет выполнена. Возможно, вы откатили всю транзакцию назад.