Как предотвратить запуск триггера вставки, когда ни одна строка не вставлена? - PullRequest
3 голосов
/ 25 июня 2010

У меня есть ТАБЛИЦА1.В этой таблице я создал триггер: ПОСЛЕ ВСТАВКИ ИЛИ ОБНОВЛЕНИЯ ИЛИ УДАЛЕНИЯ

Теперь, если я сделаю вставку, которая ничего не вставляет, триггер все равно будет запущен:

insert into TABLE1 select * from TABLE1 where 1=0;

Этот запрос будет вставлять NO ROWS, но триггер все еще срабатывает.

Есть ли способ избежать этого?Это нормальное поведение?

Ответы [ 3 ]

4 голосов
/ 25 июня 2010

Да, это нормальное поведение. Этого можно избежать, хотя для этого необходимо иметь три триггера:

  1. Триггер ДО, чтобы установить для логической переменной пакета значение ЛОЖЬ
  2. Триггер FOR EACH ROW для установки переменной в значение TRUE при вставке строки
  3. Триггер AFTER, который у вас есть, теперь вы можете проверить значение переменной перед выполнением ее действия.

Звучит как перебор? Может быть, это так: чего пытаться достичь с помощью триггера?

3 голосов
/ 25 июня 2010

Это нормальное поведение, Oracle ожидает вставки строки, поэтому он запускает триггеры BEFORE INSERT и AFTER INSERT, даже если строка не вставлена. Одной из целей триггеров AFTER является выполнение некоторых действий после успешного выполнения оператора. Это утверждение удалось:)

Вы можете посчитать количество строк, затронутых переменной пакета:

  • установить переменную mypackage.table1_nb_ins равной 0 в триггере ПЕРЕД ВСТАВКОЙ
  • увеличить счетчик в триггере ПОСЛЕ ВВЕДЕНИЯ ДЛЯ КАЖДОЙ СТРОКИ

и затем выполните логику AFTER INSERT, если ваш счетчик больше 0

0 голосов
/ 22 июня 2017

Триггеры строк

Триггер строки запускается каждый раз, когда оператор триггера влияет на таблицу. Например, если инструкция UPDATE обновляет несколько строк таблицы, триггер строки запускается один раз для каждой строки, на которую воздействует инструкция UPDATE. Если оператор запуска не влияет на строки, триггер строки не запускается.

https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm

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