Триггеры на события изменения метаданных
Триггеры на события изменения метаданных (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 событий.