Триггеры на события изменения метаданных
Триггеры на события изменения метаданных (DDL триггеры) предназначены для обеспечения ограничений, которые будут распространены на пользователей, которые пытаются создать, изменить или удалить DDL объект.Другое их назначение — ведение журнала изменений метаданных.
Триггеры на события изменения метаданных являются одним из подвидов триггеров на события базы данных.
Особенности:
-
BEFORE
триггеры запускаются до изменений в системных таблицах.AFTER
триггеры запускаются после изменений в системных таблицах. -
Когда оператор DDL запускает триггер, в котором возбуждается исключение (
BEFORE
илиAFTER
, преднамеренно или неумышленно), оператор не будет фиксирован. Т.е. исключения могут использоваться, чтобы гарантировать, что оператор DDL будет отменен, если некоторые условия не будут соблюдены. -
Действия DDL триггеров выполняются только при фиксации транзакции, в которой работает затронутая DDL команда. Никогда не забывайте о том, что в
AFTER
триггере, возможно сделать только то, что возможно сделать после DDL команды без автоматической фиксации транзакций. Вы не можете, например, создать таблицу в триггере и использовать её там. -
Для операторов
CREATE OR ALTER …
триггер срабатывает один раз для событияCREATE
или событияALTER
, в зависимости от того существовал ли ранее объект. Для операторовRECREATE
триггер вызывается для событияDROP
, если объект существовал, и после этого для событияCREATE
. -
Если объект метаданных не существует, то обычно триггеры на события ALTER и DROP не запускаются. Исключения описаны в пункте 6.
-
Исключением из правила 5 являются
BEFORE {ALTER | DROP} USER
триггеры, которые будут вызваны, даже если имя пользователя не существует. Это вызвано тем, что эти команды выполняются для базы данных безопасности, для которой не делается проверка существования пользователей перед их выполнением. Данное поведение, вероятно, будет отличаться для встроенных пользователей, поэтому не пишите код, который зависит от этого. -
Если некоторое исключение возбуждено после того как начала выполняться DDL команда и до того как запущен
AFTER
триггер, тоAFTER
триггер не запускается. -
Для процедур и функций в составе пакетов не запускаются индивидуальные триггеры
{CREATE | ALTER | DROP} {PROCEDURE | FUNCTION}
. -
Оператор
ALTER DOMAIN old name TO new name
устанавливает контекстные переменныеOLD_OBJECT_NAME
иNEW_OBJECT_NAME
в обоих триггерахBEFORE
иAFTER
. Контекстная переменнаяOBJECT_NAME
будет содержать старое имя объекта метаданных в триггереBEFORE
, и новое — в триггереAFTER
.
Если в качестве события указано предложение ANY DDL STATEMENT
, то триггер будет вызван при наступлении любого из DDL событий.