Подтвердить что ты не робот

Триггер уровня и триггер уровня инструкции

Мне сложно понять разницу между триггерами на уровне строк и триггерами уровня инструкций.

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

Это правильно? Есть ли у кого-нибудь пример этих двух?

Спасибо!

4b9b3361

Ответ 1

Основное отличие состоит не в том, что может быть изменено триггером, а в зависимости от СУБД. Триггер (уровень строки или оператора) может изменять одну или несколько строк * той же или других таблиц, а также может иметь каскадные эффекты (запускать другие действия/триггеры), но все это, конечно, зависит от СУБД.

Основное отличие заключается в том, сколько раз активируется триггер. Представьте, что у вас есть таблица с 1М строк и вы выполняете:

UPDATE t
SET columnX = columnX + 1

Триггер уровня оператора будет активирован один раз (и даже если строки не обновляются). Триггер уровня строки будет активирован миллион раз, один раз для каждой обновленной строки.


Еще одно отличие - это порядок или активация. Например, в Oracle 4 различных типа триггеров будут активированы в следующем порядке:

Before the triggering statement executes
Before each row that the triggering statement affects
After each row that the triggering statement affects
After the triggering statement executes

В предыдущем примере у нас было бы что-то вроде:

Before statement-level trigger executes

  Before row-level trigger executes
  One row is updated
  After row-level trigger executes

  Before row-level trigger executes
  Second row is updated
  After row-level trigger executes

  ...

  Before row-level trigger executes
  Millionth row is updated
  After row-level trigger executes

After statement-level trigger executes

добавление

* Относительно того, какие строки могут быть изменены триггером: разные СУБД имеют различные ограничения на это в зависимости от конкретной реализации или триггеров в СУБД. Например, Oracle может показывать ошибки "изменяющейся таблицы" в некоторых случаях, например, когда триггер уровня строки выбирает из всей таблицы (SELECT MAX(col) FROM tablename) или если он изменяет другие строки или всю таблицу, а не только строка, связанная с/запущенная из.

Конечно, для триггера уровня строки (в Oracle или другом) вполне допустимо изменять строку, в которой ее изменение вызвало ее, и это очень распространенное использование. Пример в dbfiddle.uk.

Другие СУБД могут иметь другие ограничения на то, что может делать любой тип триггера, и даже на то, какой тип триггеров предлагается (некоторые, например, не имеют триггеров BEFORE, некоторые вообще не имеют триггеров на уровне операторов и т.д.).

Ответ 2

Вы можете потребовать, чтобы действие триггера выполнялось один раз после того, как клиент выполнил оператор, который модифицирует миллион строк (триггер уровня инструкций). Или вы можете активировать действие один раз для каждой измененной строки (триггер уровня строки).

ПРИМЕР. Скажем, у вас есть триггер, который позволит всем выпускникам старших классов средней школы. То есть, когда старший класс равен 12, и мы увеличиваем его до 13, мы хотим установить класс NULL.

Для триггера уровня инструкции, как вы сказали бы, после выполнения оператора увеличения класса, проверьте всю таблицу один раз, чтобы обновить любые значения с 13 до NULL.

Для триггера уровня строки, скажем, после каждой обновляемой строки обновите новый класс до NULL, если он равен 13.

Триггер уровня инструкции выглядит следующим образом:

create trigger stmt_level_trigger
after update on Highschooler
begin
    update Highschooler
    set grade = NULL
    where grade = 13;
end;

и триггер уровня строки будет выглядеть так:

create trigger row_level_trigger
after update on Highschooler
for each row
when New.grade = 13
begin
    update Highschooler
    set grade = NULL
    where New.ID = Highschooler.ID;
end;

Обратите внимание, что SQLite не поддерживает триггеры уровня инструкций, поэтому в SQLite FOR EACH ROW не является обязательным.

Ответ 3

Основное различие между триггером уровня инструкции ниже:

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

Триггер уровня строки: выполняется каждый раз, когда затрагивается строка. если нулевые строки затронуты. Идет запуск триггера уровня. Предположим, хотите ли вы удалить одно приложение из таблицы emp, чей отдел HR и u хотите, как только сотрудник удалил из таблицы emp, счет в таблице dept из раздела HR должен быть уменьшен на 1. Затем вы должны выбрать триггер уровня.

Ответ 4

триггер уровня инструкции только один раз для dml-строки строки leval trigger для каждой строки для операторов dml

Ответ 5

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

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

Ответ 6

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

пример: -you должен удалить набор строк, и одновременно эти удаленные строки также должны быть вставлены в новую таблицу для целей аудита;

2) триггер уровня оператора: - обычно используется для наложения ограничения на событие, которое вы выполняете.

пример: - ограничение на удаление данных с 22:00 до 6:00;

надеюсь это поможет:)