DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Идентификаторы корреляции в строковых триггерах

Строковый триггер запускается один раз для каждой строки, обрабатывае­мой активизирующим оператором. Внутри триггера можно обращаться к данным строки, обрабатываемой в данный момент. Для этого служат два идентификатора корреляции — : old и : new. Идентификатор корреляции (correlation identifier) — это переменная привязки PL/SQL особого рода. Двоеточие перед идентификатором указывает на то, что это переменные привязки (подобны базовым переменным, используемым во встроенном PL/SQL), а не обычные переменные PL/SQL. Компилятор PL/SQL pac-сматривает их как записи типа

Внимание
Псевдозапись : old не определена для операторов INSERT, а для операторов DELETE не определена псевдозапись : new. В случае использования .о1бв операторе INSERT или: new в операторе DELETE компилятор PL/SQL не будет генерировать ошибку, но значения полей обеих записей будут NULL.
В        определен еще один идентификатор корреляции — : parent.
-eJ Если триггер создается для вложенной таблицы, : old и : new ссылают­ся на ее строки, а : parent — на текущую строку родительской таблицы

(см. документацию Oracle).
GenerateNewStudentID модифицирует значение : new. ID. Это одно из по­лезных свойств : new — когда выполнение оператора завершается, исполь­зуются те значения, которые содержатся в : new. С помощью триггера GenerateNewStudentID можно выполнить оператор:
Ошибка при этом не возникает. Хотя значение для столбца ID, являю­щегося первичным ключом, указано не было (что обязательно), оно будет введено триггером. Если указать значение ID, оно будет проигнорирова­но, так как триггер его изменит. Если выполнить оператор
то в столбец ID будет введено значение student_sequence. NEXTVAL, а не -7.
Именно поэтому нельзя изменить : new в строковом триггере AFTER, так как оператор будет обработан раньше. Вообще говоря, : new модифи­цируется только в строковых триггерах BEFORE; ; old никогда не моди­фицируется, а лишь считывается.
Записи : new и : old разрешается использовать только в строковых триггерах. Если указать из них в операторном        будет выдана ошибка компиляции. Поскольку операторный триггер выполняется
лишь однажды (даже в том случае, когда в операторе обрабатывается несколько строк), псевдозаписи : old и : new не имеют никакого смысла. Действительно, на какую из строк будет ссылаться каждая из них?
Псевдозаписи Хотя : new и : old синтаксически рассматриваются в каче­стве записей типа. Приведем пример:

 


купить диплом







jAntivirus