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