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