Перейти к основному содержимому

Видимость изменений данных

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

  • Триггеры уровня операторов следуют простым правилам видимости: ни одно из изменений, внесенных оператором, не видно триггерам уровня оператора BEFORE, тогда как все изменения видны триггерам уровня оператора AFTER.
  • Изменение данных (вставка, обновление или удаление), вызывающее срабатывание триггера, естественно не видно для SQL-команд, выполняемых в триггере уровня строки BEFORE, потому что это еще не произошло.
  • Однако SQL-команды, выполняемые в триггере уровня строки BEFORE, увидят последствия изменений данных для строк, обработанных ранее в той же внешней команде. Это требует осторожности, поскольку порядок этих событий изменения не является предсказуемым в общем случае; SQL-команда, которая влияет на несколько строк, может посетить строки в любом порядке.
  • Аналогично, триггер уровня строки INSTEAD OF увидит результаты изменений данных, внесенных предыдущими запусками INSTEAD OF триггеров в одной и той же внешней команде.
  • Когда срабатывает триггер уровня строки AFTER, все изменения данных, сделанные внешней командой, уже завершены и видны вызванной функции триггера.

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

Дополнительную информацию о правилах видимости данных можно найти в разделе «Видимость изменений данных». Пример в разделе «Полный пример триггера» содержит демонстрацию этих правил.