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

#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. Если уведомление будет показано, вставка будет выполнена. Возможно, вы откатили всю транзакцию назад.