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

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

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

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

  • Все триггеры на уровне оператора следуют простым правилам видимости: никакие изменения, внесенные оператором, не видны для триггеров на уровне оператора BEFORE, в то время как все модификации видны для триггеров на уровне оператора AFTER.

  • Все изменения данных (вставка, обновление или удаление), вызывающие срабатывание триггера, естественно, не видны в SQL-командах, выполняемых в триггере BEFORE на уровне строки, потому что они еще не произошли.

  • Однако, SQL-команды, выполненные в триггере BEFORE на уровне строки, увидят эффекты изменений данных для ранее обработанных строк в той же самой внешней команде. Это требует осторожности, поскольку порядок этих событий изменений в общем случае непредсказуем; SQL-команда, влияющая на несколько строк, может посещать строки в любом порядке.

  • Аналогично, триггер на уровне строки INSTEAD OF будет видеть эффекты изменений данных, сделанных предыдущими запусками триггеров INSTEAD OF в той же внешней команде.

  • Когда срабатывает триггер AFTER на уровне строки, все изменения данных, сделанные внешней командой, уже завершены и видны вызванной функции триггера.

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

Дополнительную информацию о правилах видимости данных можно найти в Раздел 45.5. Пример в Раздел 37.4 содержит демонстрацию этих правил.