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