Автор работы: Пользователь скрыл имя, 28 Февраля 2013 в 14:56, лекция
Основы реляционной модели данных были впервые изложены в статье Е.Кодда в 1970 г. Эта работа послужила стимулом для большого количества статей и книг, в которых реля-ционная модель получила дальнейшее развитие. Наиболее распространенная трактовка реляционной модели данных принадлежит К.Дейту. Согласно Дейту, реляционная модель состоит из трех частей:
• Структурной части
• Целостной части
• Манипуляционной части
столбцов.
ДОПУСТИМЫЕ ПРЕДЛОЖЕНИЯ SQL В ТЕЛЕ ТРИГГЕРА. Тело триггера может
содержать любые предложения DML, включая предложения SELECT
(только SELECT ... INTO или предложения SELECT в определениях
курсоров), INSERT, UPDATE и DELETE; в теле триггера не
допускаются предложения
DDL. Нельзя также управлять
в контексте триггера. Поэтому внутри контекста тела триггера не
допускаются следующие предложения: ROLLBACK, COMMIT и SAVEPOINT.
Замечание: Процедура, вызываемая из триггера, также не может
выполнять перечисленных выше предложений управления
транзакциями, ибо такая процедура исполняется внутри контекста
тела триггера.
Предложения внутри триггера могут адресоваться к удаленным
объектам. Однако будьте особенно внимательны, вызывая удаленные
процедуры из локального триггера; если во время выполнения
триггера будет обнаружено несовпадение отметок времени, то
удаленная процедура не выполняется, а триггер станет
недействительным.
ТИПЫ ДАННЫХ LONG И LONG RAW В ТРИГГЕРЕ. Следующие правила
объясняют особенности использования типов данных LONG и LONG RAW
внутри триггеров:
* Предложение SQL внутри триггера может вставлять данные в
столбец типа данных LONG или LONG RAW.
* Если данные из столбца LONG или LONG RAW могут быть
преобразованы в ограниченный тип данных (такой как CHAR
или VARCHAR2), то к такому столбцу LONG или LONG RAW
можно обращаться в предложении SQL внутри триггера.
Заметьте, что максимальная длина для этих типов данных
равна 32K.
* Нельзя объявлять переменные с типом данных LONG или LONG
RAW.
* Нельзя использовать квалификаторы :NEW и :OLD со
столбцами LONG и LONG RAW.
ТАБЛИЦЫ С ЖУРНАЛАМИ СНИМКОВ. Создание журнала снимков неявно
создает триггер AFTER ROW по главной таблице. Поэтому нельзя
создать пользовательский триггер AFTER ROW по главной таблице,
имеющей журнал снимков. И наоборот, если для таблицы определен
триггер AFTER ROW, то для этой таблицы нельзя создать журнал
снимков; необходимо сначала удалить этот триггер. Снимки и
журналы снимков обсуждаются в главе 12.
ССЫЛКИ НА ПАКЕТИРОВАННЫЕ ПЕРЕМЕННЫЕ. Если предложение UPDATE
или DELETE обнаруживает конфликт с конкурирующей операцией
UPDATE, то ORACLE выполняет прозрачный откат к точке сохранения
и повторно запускает обновление. Это может повториться
многократно, пока предложение не выполнится успешно. Каждый
раз, когда предложение
перезапускается,
BEFORE предложения снова возбуждается. Откат к точке сохранения
не отменяет изменений в любых пакетированных переменных,
адресуемых в этом триггере. Соответствующий пакет должен
включать переменную-счетчик,
чтобы распознавать такую
ПОРЯДОК ВЫЧИСЛЕНИЯ СТРОК. Реляционная база данных не
гарантирует определенности порядка строк, обрабатываемых
предложением SQL. Поэтому не создавайте триггеров, которые
зависят от того, в каком порядке будут обрабатываться строки.
Например, не назначайте значения глобальной пакетированной
переменной в триггере строк, если это текущее значение зависит
от того, какая строка сейчас обрабатывается триггером строк.
Кроме того, если в триггере обновляются глобальные
пакетированные переменные, лучше всего инициализировать такие
переменные в триггере предложения BEFORE.
Если предложение в теле триггера вызывает возбуждение другого
триггера, этот эффект называется КАСКАДОМ ТРИГГЕРОВ. ORACLE
позволяет иметь одновременно до 32 каскадно возбужденных
триггеров. Однако вы можете по существу ограничить количество
каскадных триггеров через параметр инициализации
MAX_OPEN_CURSORS; для каждого исполнения триггера должен
открываться курсор.
МУТИРУЮЩИЕ И ОГРАНИЧИВАЮЩИЕ ТАБЛИЦЫ. Мутирующая таблица - это таблица, модифицируемая в данный момент предложением UPDATE,
DELETE или INSERT, или таблица, которая может потребовать
обновления в результате действия декларативного ссылочного
ограничения целостности DELETE CASCADE. Ограничивающая таблица
- это таблица, которую предложение, возбуждающее триггер или
ограничение, должно читать, - либо явно (для предложения SQL),
либо неявно (для декларативного ограничения ссылочной
целостности). Мутирующая или ограничивающая таблица является
таковой лишь для той сессии, которая выдает предложение,
возбуждающее триггер или ограничение.
Для триггеров предложений таблица не рассматривается как
мутирующая или как ограничивающая; однако для триггеров строк
имеют место два важных ограничения, касающихся мутирующих и
ограничивающих таблиц:
* Предложения в триггере строк не могут читать или
модифицировать мутирующую таблицу предложения триггера.
Это ограничение не
позволяет триггеру строк
несогласованным множеством данных.
* Предложения в триггере строк не могут изменять столбцов
первичного, внешнего
или уникального ключа
таблицы предложения триггера. Это ограничение введено с
тем, чтобы успех предложения внутри триггера не зависел
от порядка обработки
строк или от индекса.
Для этого правила существует одно исключение: триггер
BEFORE ROW, возбужденный предложением INSERT, вставляющим
одиночную строку в таблицу с внешним ключом, может
модифицировать любые
столбцы первичной таблицы,
модификация не нарушает
никаких ограничений
Рис.8-1 иллюстрирует ограничение для мутирующих таблиц.
Рис.8-1
Мутирующие таблицы
Исходная Предложение SQL, Мутирующая
таблица EMP возбуждающее триггер таблица EMP
--------------¬
¦ ENAME SAL ¦ UPDATE emp ¦ ENAME SAL ¦
¦ ----- --- ¦ SET sal = sal * 1.1; ¦ ----- --- ¦
¦ SMITH 1000 ¦ ¦-SMITH--1100-¦-----¬
¦ JONES 1000 ¦ -------------------- ¦ JONES 1000 ¦ ¦
¦ WARD 1000 ¦ ¦ WARD 1000 ¦ ¦
L--------------
- ¦
¦ ¦
Не допускается, --------------------- X ¦
так как таблица EMP L------------------
мутирует
содержит предложение:
SELECT sal FROM emp WHERE ...
Пример, показанный на рис.8-1, работает следующим образом.
Предложение SQL исполняется для первой строки таблицы. Затем
возбуждается триггер AFTER ROW. В свою очередь, предложение
внутри тела триггера AFTER ROW пытается опросить первоначальную
таблицу. Однако, поскольку таблица EMP мутирует, ORACLE не
позволяет этот запрос. Поэтому возникает ошибка времени
выполнения, эффекты тела триггера и предложения, возбудившего
триггер, откатываются, и управление возвращается пользователю
или приложению.
Если вам необходимо обновить мутирующую или ограничивающую
таблицу, вам следует использовать временную таблицу, таблицу
PL/SQL или пакетированную переменную, чтобы обойти эти
ограничения.
Декларативные ограничения целостности проверяются в различные
моменты времени по отношению к триггерам строк; обратитесь к
документу ORACLE7 Server Concepts Manual за информацией о том,
как взаимодействуют
триггеры и ограничения
Привилегии, требуемые для создания триггеров
Чтобы создать триггер в своей схеме, вы должны иметь системную
привилегию CREATE TRIGGER, а также одно из:
* владеть таблицей, специфицированной в предложении
триггера, или
* иметь привилегию ALTER для таблицы, специфицированной в
предложении триггера, или
* иметь системную привилегию ALTER ANY TABLE
Чтобы создать триггер в схеме другого пользователя, вы должны
иметь системную привилегию CREATE ANY TRIGGER. Эта привилегия
позволять создать триггер в любой схеме и ассоциировать его с
таблицей любого пользователя.
Привилегии для объектов схем, адресуемых в теле триггера
Как и для хранимых процедур, владелец триггера должен иметь
объектные привилегии для объектов, адресуемых в теде триггера,
причем эти привилегии должны быть получены им явно (не через
роли). Предложения в теле триггера оперируют под доменом защиты
владельца триггера, а не того пользователя, который выдает
предложение, возбуждающее триггер.
Отладка триггеров
Триггеры можно отлаживать с помощью тех же средств, которые
применяются для отладки процедур и пакетов; см. секцию "Отладка
процедур и пакетов" на странице 7-15.
Изменение триггеров
Нельзя явно изменить триггер; его необходимо заменить новым
определением триггера. Если вы используете текстовый редактор
для создания ваших триггеров, вы можете просто отредактировать
соответствующий текстовый файл и выполнить предложение CREATE
TRIGGER, чтобы определить новую версию кода.
Заменяя триггер, вы
опцию OR REPLACE. Опция OR REPLACE позволяет заменить
Информация о работе Общая характеристика реляционной модели данных