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