36.2. Видимость изменений данных#
36.2. Видимость изменений данных #
Если вы выполняете SQL-команды в триггерной функции и эти команды обращаются к таблице, для которой создан триггер, то необходимо учитывать правила видимости данных, поскольку они определяют, будут ли эти SQL-команды видеть изменения данных, для которых был запущен триггер. Кратко говоря:
Все триггеры на уровне оператора следуют простым правилам видимости: никакие изменения, внесенные оператором, не видны для триггеров на уровне оператора
BEFORE
, в то время как все модификации видны для триггеров на уровне оператораAFTER
.Все изменения данных (вставка, обновление или удаление), вызывающие срабатывание триггера, естественно, не видны в SQL-командах, выполняемых в триггере
BEFORE
на уровне строки, потому что они еще не произошли.Однако, SQL-команды, выполненные в триггере
BEFORE
на уровне строки, увидят эффекты изменений данных для ранее обработанных строк в той же самой внешней команде. Это требует осторожности, поскольку порядок этих событий изменений в общем случае непредсказуем; SQL-команда, влияющая на несколько строк, может посещать строки в любом порядке.Аналогично, триггер на уровне строки
INSTEAD OF
будет видеть эффекты изменений данных, сделанных предыдущими запусками триггеровINSTEAD OF
в той же внешней команде.Когда срабатывает триггер
AFTER
на уровне строки, все изменения данных, сделанные внешней командой, уже завершены и видны вызванной триггерной функции.
Если ваша триггерная функция написана на одном из стандартных процедурных языков, то вышеприведенные утверждения применяются только в том случае, если функция объявлена как VOLATILE
. Функции, объявленные как STABLE
или IMMUTABLE
, не будут видеть изменений, внесенных вызывающей командой в любом случае.
Дополнительную информацию о правилах видимости данных можно найти в Раздел 44.5. Пример в Раздел 36.4 содержит демонстрацию этих правил.