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 содержит демонстрацию этих правил.