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