Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Триггеры и хранимые процедуры






 

Триггеры и хранимые процедуры - это именованные блоки кода SQL, которые заранее откомпилированы и хранятся на сервере для того, чтобы быстро производить выполнение запросов, валидацию данных и выполнять другие часто вызываемые функции.

Хранение и выполнение кода на сервере позволяет создавать код только один раз, а не в каждом приложении, работающем с БД, что экономит время при написании и сопровождении программ. При этом гарантируется, что целостность данных и бизнес-правила поддерживаются независимо от того, какое именно клиентское приложение обращается к данным. Тригге­ры и хранимые процедуры не требуется пересылать по сети из клиентского приложения, что значительно снижает сетевой трафик.

Хранимой процедурой называется именованный набор предварительно откомпилированных команд SQL, который может вызываться из клиент­ского приложения или из другой хранимой процедуры.

Триггером называется процедура, которая выполняется автоматически как реакция на событие. Таким событием может быть вставка, изменение или удаление строки в существующей таблице. Триггер сообщает СУБД, какие действия нужно выполнить при выполнении команд SQL INSERT, UPDATE или DELETE для обеспечения дополнительной функционально­сти, выполняемой на сервере.

Триггер ссылочной целостности - особый вид триггера, используемый для поддержания целостности между двумя таблицами, которые связаны между собой. Если строка в одной таблице вставляется, изменяется или удаляется, то триггер ссылочной целостности (RI-триггер) сообщает СУБД, ''то нужно делать с теми строками в других таблицах, у которых значение внешнего ключа совпадает со значением первичного ключа вставленной (измененной, удаленной) строки. По умолчанию ER-win генерирует триггеры, дублирующие декларативную ссылочную целостность (см. 2.2.3). Например, если удаляется клиент из таблицы CUSTOMER (см. рис. 2.73), то в зависимости от установленных правил ссылочной целостности могут быть сгенерированы RI-триггеры, которые будут воздействовать на соответствующие удаляемому клиенту заказы из таблицы ORDER. Команда DELETE Ш может быть обработана следующими способами:

- Проверяется наличие заказов у удаляемого клиента и, если заказы есть, I запрещается удаление клиента из таблицы CUSTOMER. Правило ссылочной целостности, запрещающее вставку, изменение или удаление строки, называется RESTRICT.

- Клиент удаляется из таблицы CUSTOMER, и все соответствующие ему строки в таблице ORDER также автоматически удаляются. Правило ссылочной целостности, передающее изменение от одной таблицы к другой, называется CASCADE. При этом все заказы удаленного клиента теряются. Если эту информацию необходимо сохранить, можно переопределить триггер ссылочной целостности так, чтобы записать, например, эту информацию в архивную таблицу.

- Клиент удаляется, но номеру клиента в таблице заказов автоматический

присваивается нулевое значение. Правило ссылочной целостности, изменяющее текущее значение данных на нулевое, называется SET NULL.

Для генерации триггеров ER-win использует механизм шаблонов - специальных скриптов, использующих макрокоманды. При генерации кода триггера вместо макрокоманд подставляются имена таблиц, колонок, переменные и другие фрагменты кода, соответствующие синтаксису выбранной СУБД. Шаблоны триггеров ссылочной целостности, генерируемые ER-win, по умолчанию можно изменять, кроме того, можно переопределить как триггеры для конкретной связи, так и шаблоны во всей модели в целом.

Шаблоны триггеров ссылочной целостности связываются с сущностями в зависимости от типа связи и роли сущности в этой связи. Тип связи и роль сущности определяют, какое правило ссылочной целостности будет по умолчанию дополнено шаблоном триггера. Связи могут быть: идентифицирующими, не идентифицирующими (nulls allowed), неидентифицирующими (no nulls), связями подтипа.

Сущность в связи может быть родительская (Parent) или дочерняя (Child). Если сущность является родительской в данной связи, то ER-win присваивает ей шаблон триггера для родительской сущности. Если сущность является дочерней в данной связи, то ER-win присваивает ей шаблон триггера для дочерней сущности. Код триггера, который генерируется шаблоном триггера для родительской сущности, указывает СУБД, что нужно делать при вставке, изменении или удалении строки в родительской таблице связи. Код триггера, который генерируется шаблоном триггера для до­черней сущности, указывает СУБД, что нужно делать при вставке, измене­нии или удалении строки в дочерней таблице связи.

Ниже приведен текст шаблона триггера, соответствующего правилу ссы­лочной целостности ON PARENT DELETE RESTRICT.

/* ER-win Builtin %Datetime */

/* %Parent %VerbPhrase %Child ON PARENT DELETE RESTRICT*/

select count(*) into numrows

from %Child

where

/*%%JoinFKPK(%Child,: %%Old, ” =”, " and") */

%JoinFKPK(%Child,: %0Id, ”=”, " and');

if (numrows > 0)

then

raise_applicalifm_error(

-20001,

'Cannot DELETE %Parent because %Child exists.'

);

end if;

При генерации схемы СУБД для Oracle 7.2 будет сгенерирован триггер:

create trigger ID_CUSTOMER after DELETE on CUSTOMER for each row

- ER-win Builtin Tue Jan 26 21: 55: 131Э99

- DELETE trigger on CUSTOMER

declare numrows INTEGER;

begin

/'*ER-win Suiltin Tue Jan 26 21: 55: 131999 */

/* CUSTOMER размещает ORDER ON PARENT DELETE RESTRICT */

select count(*) into numrows

from ORDER

where

/*%JoinFKPK(ORDER,: %Old, " =", " and”) */

ORDER.Customer ID =: old, CustomerlD;

if (numrows > 0)

then

raise_application_error(

-20001,

'Cannot DELETE CUSTOMER because ORDER exists.’

);

end if;

ER-win по умолчанию использует для генерации кода трип-ера на языке SQL встроенные шаблоны триггеров ссылочной целостности, которые ав­томатически присваиваются каждой связи. Если встроенные шаблоны не удовлетворяют бизнес-правилам, можно изменить коды триггера, генери­руемые на основе встроенных шаблонов. ER-win позволяет изменить шаблон и указать, что при генерации модифицированная версия должна заме­нить встроенный шаблон.

ER-win позволяет переопределить триггер, устанавливаемый по умолча­нию, тремя способами;

- Переопределение типа ссылочной целостности. Для каждой комбинации правил ссылочной целостности (например, Parent-Delete RESTRICT) ER-win позволяет создать переопределенный шаблон и использовать этот шаблон вместо шаблона, применяемого по умолчанию, для всех связей диаграммы, которым был присвоен этот тип правила ссылочной целост­ности. Используя в качестве основы встроенный код шаблона, можно изменить шаблоны ссылочной целостности во всей модели, изменяя ко­ды триггера только в одном месте. Вновь определяемые шаблоны будут использоваться вместо стандартных шаблонов, если при генерации схемы включена опция RI Type Override.

- Переопределение шаблона триггера для связи. Можно переопределить шаб­лон, задаваемый по умолчанию, для какой-то конкретной связи. Для этого используется диалог Relationship Template Editor, в котором можно описать шаблоны Relationship Override, применяемые вместо стандарт­ных шаблонов (а также вместо шаблонов RI Type Override, если они есть). Шаблоны Relationship Override будут использоваться вместо стан­дартных шаблонов, если при генерации схемы включена опция Relationship Override.

- Переопределение шаблона триггера для сущности. ER-win позволяет соз­давать собственные триггеры Entity Override для любой сущности в мо­дели. Шаблоны Entity Override используются вместо стандартных шаб­лонов, а также вместо шаблонов RI Type Override и Relationship Override, если при генерации схемы включена опция Entity Override. ER-win имеет специальные редакторы, облегчающие создание и редакти­рование триггеров и процедур.

Для редактирования триггера следует щелкнуть правой кнопкой мыши по таблице и выбрать во всплывающем меню пункт Trigger. Появляется диалог Table Trigger Viewer, в нижней части которого имеется две кнопки Table Trigger и Trigger Template, которые вызывают диалоги, предназначенные для создания и редактирования пользовательских триггеров и шаблонов триггеров ссылочной целостности (рис. 2.78).

 

 

Рис. 2.78. Диалог Table Trigger Viewer

 

Рассмотрим простейший пример, в котором переопределим шаблон триггера для сущности. Предположим, бизнес-правила требуют, чтобы при любом изменении имени клиента (колонка CustomerHame таблицы CUSTOMER, рис. 2.79) в таблице SECURITY создавалась строка, в которой бы фиксировалось прежнее значение имени, новое значение, дата измене­ния и имя пользователя, произведшего изменения и имя пользователя, произведшего изменения.

 

 

Рис. 2.79. Таблицы CUSTOMER и SECURITY

 

Для создания триггера служит редактор Table Trigger Editor (вызывается кнопкой Table Trigger диалога Table Trigger Viewer) (рис. 2.80).

 

Рис. 2.80. Диалог Table Trigger Editor

 

Раскрывающийся список Table позволяет выбрать таблицу, на которой будет создан триггер. На рис. 2.80 это таблица CUSTOMER.

В списке Trigger отображается имя триггера (SecurWrite). Если имя не задано, ER-win генерирует триггеры ссылочной целостности по умолчанию. Кнопки New, Rename и Delete служат соответственно для внесения нового триггера в список, переименования и удаления триггера из списка.

Группа окон выбора Trigger Он позволяет задать тип триггера - при в ком событии триггер будет запускаться - при удалении Delete, вставке Insert или обновлении Update-строки таблицы. При выборе любого события ER-win автоматически формирует текст шаблона соответствующе триггера ссылочной целостности. Опции Before и After позволяют задать время выполнения триггера - до или после SQL-команд INSERT, UPDAT или DELETE. В примере на рис, 2.80 создается триггер, выполняемый до команды обновления UPDATE для колонки Customer Name таблиц






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.