Текст книги "BPwin и Erwin. CASE-средства для разработки информационных систем"
Автор книги: Сергей Маклаков
Жанр:
Базы данных
сообщить о нарушении
Текущая страница: 9 (всего у книги 14 страниц)
В таблице БД данные обычно хранятся в том же порядке, в котором их ввели в таблицу. Многие реляционные СУБД имеют страничную организацию, при которой физически таблица может храниться фрагментарно в разных областях диска, причем строки таблицы располагаются на страницах неупорядоченно. Хотя такой способ хранения и позволяет быстро вводить новые данные, но для того, чтобы найти нужную строку, придется просмотреть всю таблицу. В промышленных системах каждая таблица может содержать миллионы строк, поэтому простой перебор ведет к катастрофическому падению производительности ИС.
Чтобы решить проблему поиска данных, СУБД использует особый объект, называемый индексом. Он подобен содержанию книги, которое указывает на все номера страниц, посвященных конкретной теме. Индекс содержит отсортированную по колонке или нескольким колонкам информацию и указывает на строки, в которых хранится конкретное значение колонки.
Например, если необходимо найти клиента по имени (рис. 2.73), можно создать индекс по колонке CustomerName таблицы CUSTOMER. В индексе имена клиентов будут отсортированы в алфавитном порядке. Для имени индекс будет содержать ссылку, указывающую, в каком месте таблицы хранится эта строка.
Рис. 2.73
Для поиска клиента серверу направляется запрос с критерием поиска (CusfomerName ="Иванов"). При выполнении запроса СУБД просматривает индекс, вместо того чтобы просматривать по порядку все строки таблицы CUSTOMER, Поскольку значения в индексе хранятся в определенном порядке, просматривать нужно гораздо меньший объем данных, что значительно уменьшает время выполнения запроса. Индекс можно создать для всех колонок таблицы, по которым часто производится поиск.
При генерации схемы физической БД ERwin автоматически создает отдельный индекс на основе первичного ключа каждой таблицы, а также на основе всех альтернативных ключей, внешних ключей и инверсионных входов, поскольку эти колонки наиболее часто используются для поиска данных. Можно отказаться от генерации индексов по умолчанию и для повышения производительности создать собственные индексы. Администратор СУБД должен анализировать наиболее часто выполняемые запросы и создавать индексы с различными колонками и порядком сортировки для увеличения эффективности поиска при работе конкретных приложений.
При создании индекса на основе ключа ERwin вводит в его состав все колонки ключа. Например, если в сущности CUSTOMER (рис. 2.73) три атрибута назначены как АК1, ERwin автоматически создает индекс и включает в него все три атрибута (CustomerName, Region, City}. Следовательно, на уровне логической модели можно неявно создать индекс, включая колонки в состав альтернативных ключей и инверсионных входов.
ERwin автоматически генерирует имя индекса, созданного на основе ключа по принципу "X" + имя ключа + имя таблицы (физическое имя таблицы, а не логическое имя сущности!), где имя ключа "РК" для первичного ключа, "IFn" – для внешнего, "AKn" – для альтернативного, "IEn" -для инверсионного входа. Например, по умолчанию при создании таблицы CUSTOMER (см. рис. 2.70) будут созданы индексы XPKCUSTOMER (первичный ключ, в состав войдет колонка CustomerID), XAK1CUSTOMER (альтернативный ключ, колонки CusfomerName, Region, City), XIE1CUSTOMER (инверсионный вход 1, колонка Region) и XIE2CUSTOMER (инверсионный вход 2, колонка CustomerAddress).
Изменить характеристики существующего индекса или создать новый можно в редакторе Index Editor (рис. 2.74). Для его вызова следует щелкнуть правой кнопкой мыши по таблице и выбрать во -всплывающем меню пункт Index.
В редакторе Index Editor можно изменить имя индекса, изменить его определение так, чтобы он принимал уникальные или дублирующиеся значения, или изменить порядок сортировки данных.
Рис. 2.74. Диалог Index Editor
ERwin создает индексы, которые могут содержать либо повторяющиеся, либо только уникальные значения. При создании нового уникального индекса (кнопка NewH, диалог New Index, рис. 2.75) следует включить опцию Unique, для создания индекса с неповторяющимися значениями опцию следует выключить. Если на основе колонки создается уникальный индекс, то при попытке вставить запись с неуникальным (повторяющимся) значением сервер выдаст ошибку и значение не будет вставлено. Например, уникальный индекс в таблице CUSTOMER, построенный на колонке QistomerName, предотвратит от внесения двух строк с информацией об одном и том же клиенте.
Иногда необходимо разрешить повторяющиеся значения, если ожидается, что индексированная колонка будет с большой вероятностью содержать повторяющуюся информацию. Например, на основе инверсионных входов, которые используются для доступа к нескольким строкам и поэтому могут содержать повторяющиеся значения, генерируется неуникальный индекс. Неуникальный индекс генерируется также на основе внешнего ключа. На основе первичного и альтернативных ключей генерируются уникальные индексы.
И наоборот, при создании нового индекса автоматически создается альтернативный ключ для уникального и инверсионный вход для неуникального индекса, а также соответствующее ключу имя индекса. Имя сгенерированного индекса в дальнейшем при необходимости можно изменить вручную.
Рис. 2.75. Диалог New Index
По умолчанию ERwin автоматически сохраняет значена . в порядке возрастания (значения сортируются по алфавиту от A до Z, а числа от 0 до 9). Если нужно изменить порядок сортировки для колонки и выбранная СУБД поддерживает режим сортировки по убыванию, следует выбрать колонку и включить опцию DESC (см. рис. 2.74).
Редактор Index Editor содержит следующие закладки:
Members – позволяет включить колонки в состав индекса;
Comment – содержит комментарий для каждого индекса;
UDP – позволяет связать с индексом свойства, определяемые пользователем
закладка, соответствующая выбранной СУБД (на рис 2.76 ORACLE) задает свойства индекса, специфические для выбранной СУБД.
Рис. 2.76. Закладка ORACLE диалога Index Editor
При создании индекса для СУБД ORACLE, SYBASE или SQL Server можно выбирать, в каком объекте физической памяти (создание и редактирование объектов физической памяти рассмотрено в 2.2.6) будет храниться индекс, и изменять параметры хранения. В табл. 2.5 представлены некоторые параметры объектов физической памяти, доступные в закладке, соответствующей выбранной СУБД диалога Index Editor для ORACLE, SYBASE и SQL.
Таблица 2.5. Параметры объектов физической памяти
Параметр | Назначение |
ORACLE | |
PCTFREE | Задает размер пространства, которое нужно оставить свободным для обновлений и вставок в каждом блоке данных |
NO SORT | Ускоряет создание индекса, если данные расположены физически по порядку. Если опция установлена, то значения индекса не сортируются; если нет, то значения индекса сортируются |
INITTRANS | Задает параметры для команды CREATE TABLE |
MAXTRANS | Задает параметры для команды CREATE TABLE |
SQL И SYBASE | |
IGNORE DUPKEY | Разрешает или запрещает использование повторяющихся значений ключа в таблице с уникальным индексом (кластеризованным или некластеризованным). Если опция установлена, то повторяющиеся значения не допускаются; если нет, то повторяющиеся значения разрешаются |
SORTED DATA | Ускоряет создание индекса, если данные расположены физически по порядку. Если опция установлена, то значения индекса не сортируются; если нет, то значения индекса сортируются |
DUP ROW | Разрешает или запрещает использование повторяющихся значений ключа в таблице с кластеризованным индексом. Если опция установлена, то повторяющиеся значения не допускаются; если нет, то повторяющиеся значения разрешаются |
FILLFACTOR | Задает, сколько данных можно добавить к странице данных при создании индекса |
Некоторые СУБД поддерживают кластеризованные и кластеризованные хешированные индексы. ERwin позволяет создать такие индексы для DB2/MVS, DB2/390, HiRDB, INFORMIX, MS Access, MS SQL Server, SYBASE и SQLBase. Для того чтобы сделать индекс кластеризованным, нужно включить опцию CLUSTER в закладке, соответствующей выбранной СУБД. Кластеризованный индекс – это специальная техника индексирования, при которой данные в таблице физически располагаются в индексированном порядке. Использование кластеризованного индекса значительно ускоряет выполнение запросов по индексированной колонке. Например, можно создать кластеризованный индекс в таблице CUSTOMER по колонке City. Информация о всех клиентах из одного города будет физически располагаться на диске рядом, что значительно повысит скорость выполнения запроса, который делает выборку всех клиентов из какого-то определенного города.
Поскольку данные физически расположены в индексированном порядке, для каждой таблицы может существовать только один кластеризованный индекс. Если СУБД поддерживает использование кластеризованного индекса, то ERwin автоматически создает индекс первичного ключа кластеризованным. При создании кластеризованного индекса не по первичному ключу ERwin автоматически снимает кластеризацию с индекса по первичному ключу. Для СУБД SQLBase (CENTURA) ERwin позволяет создать кластеризованный хешированный индекс (clustered hashed index). Хеширование -альтернативный способ хранения данных в заранее заданном порядке с целью ускорения поиска, но физически это более сложно, чем простое сохранение строк в алфавитном порядке или в соответствии с числовыми значениями.
Кластеризованный или хешированный индекс значительно ускоряет операции поиска и сортировки, но добавление и удаление строк замедляется из-за необходимости реорганизации данных для соответствия индексу.
2.3.6. Задание объектов физической памяти
ERwin поддерживает объекты физической памяти для нескольких СУБД (табл. 2.6). Все объекты создаются в модели при обратном проектировании однако объекты INFORMIX, SQL Server и SYBASE не создаются при пря-' мом проектировании.
Таблица 2.6. Поддержка ERwin объектов сЬизчческой памяти
СУБД | Обратное проектирование (Reverse Engineer) | Прямое проектирование (Forward Engineer) |
DB2/MVS и DB2/390 | STOGROUP, DATABASE, TABLESPACE | STOGROUP, DATABASE, TABLESPACE |
DB2/UDB | TABLESPACE | TABLESPACE |
Nodegroup Bufferpool | Nodegroup Bufferpool | |
DB2/CS | TABLESPACE | TABLESPACE |
ORACLE | TABLESPACE, ROLLBACK SEGMENT, DATABASE | TABLESPACE, ROLLBACK SEGMENT, DATABASE |
Red Brick | Segment | Segment |
Teradata | DATABASE | DATABASE |
WATCOM/SQL Anywhere | DBSPACE | DBSPACE |
INFORMIX | – | dbspace, blobsoace |
Openlngres | location | location |
SQL Server или SYBASE | – | Segment |
Для создания и редактирования объектов физической памяти в ERwin используется редактор Physical Object (меню Server/Physical Object). Вид этого редактора зависит от выбранной СУБД. В качестве примера рассмотрим создание и редактирование объектов физической памяти для ORACLE (рис. 2.77).
Рис. 2.77. Диалог ORACLE Physical Object Editor
Диалог ORACLE Physical Object Editor имеет три закладки:
TABLESPACE (табличное пространство). Табличное пространство представляет собой именованный сегмент в БД, состоящий из одного или более файлов данных, который можно использовать для хранения таблиц, индексов или сегментов отката. Табличное пространство полезно применять, например, чтобы выделить объекты БД, которые используются одним приложением или специфической группой приложений.
Список TABLESPACE в верхней части закладки показывает все табличные пространства в БД. Кнопки New, Rename и Delete служат соответственно для создания, переименования и удаления табличных пространств. При нажатии кнопки New возникает диалог New TABLESPACE, в котором следует задать имя табличного пространства. Свойства табличного пространства задаются в диалоге ORACLE Physical Object Editor. Данные в табличных пространствах доступны, когда области находятся в оперативном режиме (online), и недоступны, когда они находятся в автономном режиме (offline). Окно выбора OFFLINE показывает состояние доступности табличного пространства. Для перевода табличного пространства в offline следует включить опцию, в online – выключить.
Окно выбора TEMPORARY позволяет указать, что табличное пространство будет применяться только для хранения временных объектов, например сегментов, используемых при выполнении запросов с сортировкой (предложение ORDER BY). Эта опция доступна только для ORACLE 7.3.
Поля INITIAL и NEXT позволяют задать размер начального и следующего экстента в байтах.
Параметр PCTINCREASE указывает, на сколько процентов этот экстент может быть больше предыдущего по размеру.
MINEXTENTS – минимальное число экстентов, которое автоматически распределяется при создании таблицы, индекса или кластера табличного пространства.
MAXEXTENTS – максимальное число экстентов, которое можно связать с таблицей, индексом или кластером табличного пространства.
ROLLBACK SEGMENT (сегмент отката). Сегмент отката – это зарезервированный объем пространства, который используется для хранения "снимка" данных в том виде, в котором они находились до выполнения транзакции. Если транзакция не завершилась, все изменения данных откатываются и образ данных, хранящийся в сегменте отката, восстанавливается. Для создания или изменения сегмента отката у пользователя должна быть привилегия CREATE ROLLBACK SEGMENT.
Список ROLLBACK SEGMENT показывает все доступные для редактирования сегменты отката. Кнопки New, Rename и Delete служат соответственно для создания, переименования и удаления сегментов отката. При нажатии кнопки New возникает диалог New ROLLBACK SEBMENT, в котором задается имя сегмента отката.
Раскрывающийся список TABLESPACE позволяет связать сегмент отката с табличным пространством.
Окно выбора PUBLIC позволяет указать, каким будет сегмент отката -частным или общедоступным. Включенная опция PUBLIC делает сегмент отката общедоступным. Если не используется параллельная обработка, обычно создаются общедоступные сегменты отката.
Поля INITIAL и NEXT задают размер начального и следующего экстента в байтах.
OPTIMAL – оптимальное число управляемых экстентов для каждого сегмента отката. После успешного завершения транзакции Oracle автоматически восстанавливает размер сегментов отката до значения, указанного в поле OPTIMAL.
MINEXTENTS – минимальное число экстентов, которое можно связать с сегментом отката.
MAXEXTENTS – максимальное число экстентов, которое можно связать с сегментом отката.
DATABASE Database (база данных). База данных – это зарезервированный объем памяти для одного или более устройств хранения, которые используются для хранения данных и определений объектов БД, например таблиц и индексов. Для создания БД у пользователя должна быть привилегия DBA.
Список DATABASE в верхней части закладки показывает все БД сервера. Кнопки New, Rename и Delete служат соответственно для создания, переименования и удаления БД. При нажатии кнопки New возникает диалог New DATABASE, в котором следует задать имя БД. Свойства БД задаются в диалоге ORACLE Physical Object Editor.
Список LOGFILE показывает имена всех log-файлов (журналов регистрации) в БД. Справа от списка находятся поля для ввода параметров log-файлов:
MAXLOGFILES – максимальное число log-файлов, которые можно создать для БД (допустимый диапазон значений 2-56).
MAXLOGHIST – объем памяти, который должен быть зарезервирован в управляющем файле для имен групп архивных log-файлов транзакций (поддерживается Oracle? и более поздними версиями).
MAXLOGMEMS – максимальное число членов в каждой log-группе (поддерживается Oracle? и более поздними версиями).
Список DATAFILE показывает имена всех файлов данных в БД. Поле MAXDATAFILES позволяет задать максимальное количество файлов в БД.
Поле выбора CONTROL FILE REUSE служит для задания статуса повторного использования управляющего файла. Включенная опция позволяет Oracle переписать информацию в управляющих файлах, определенных в параметре INIT.ORA CONTROL_FILES. Выключенная опция запрещает Oracle повторно использовать управляющие файлы.
ARCHIVE LOG – состояние автоматического архивирования. Разрешает автоматическое архивирование информации log, используемой при восстановлении.
EXCLUSIVE – статус совместного использования данных. Выключенная опция разрешает одновременный доступ нескольких пользователей.
MAXINSTANCES – максимальное число экземпляров, для которых одновременно может быть установлена БД (допустимый диапазон значений 1-255).
CHARACTER SET – набор символов, используемый БД. Все данные в колонках типов CHAR, VARCHAR2, LONG хранятся в заданном наборе символов. После того как БД создана, набор символов не может быть изменен.
Кнопка DB Sync позволяет сгенерировать объекты физической памяти в системном каталоге СУБД сразу после их создания в диалоге Physical Object Editor.
2.3.7. Триггеры и хранимые процедуры
Триггеры и хранимые процедуры – это именованные блоки кода SQL, которые заранее откомпилированы и хранятся на сервере для того, чтобы быстро производить выполнение запросов, валидацию данных и выполнять другие часто вызываемые функции.
Хранение и выполнение кода на сервере позволяет создавать код только один раз, а не в каждом приложении, работающем с БД, что экономит время при написании и сопровождении программ. При этом гарантируется, что целостность данных и бизнес-правила поддерживаются независимо от того, какое именно клиентское приложение обращается к данным. Триггеры и хранимые процедуры не требуется пересылать по сети из клиентского приложения, что значительно снижает сетевой трафик.
Хранимой процедурой называется именованный набор предварительно откомпилированных команд SQL, который может вызываться из клиентского приложения или из другой хранимой процедуры.
Триггером называется процедура, которая выполняется автоматически как реакция на событие. Таким событием может быть вставка, изменение или удаление строки в существующей таблице. Триггер сообщает СУБД, какие действия нужно выполнить при выполнении команд SQL INSERT, UPDATE или DELETE для обеспечения дополнительной функциональности, выполняемой на сервере.
Триггер ссылочной целостности – особый вид триггера, используемый для поддержания целостности между двумя таблицами, которые связаны между собой. Если строка в одной таблице вставляется, изменяется или удаляется, то триггер ссылочной целостности (RI-триггер) сообщает СУБД, что нужно делать с теми строками в других таблицах, у которых значение внешнего ключа совпадает со значением первичного ключа вставленной (измененной, удаленной) строки. По умолчанию ERwin генерирует триггеры, дублирующие декларативную ссылочную целостность (см. 2.2.3). Например, если удаляется клиент из таблицы CUSTOMER (см. рис. 2.73), то в зависимости от установленных правил ссылочной целостности могут быть сгенерированы RI-триггеры, которые будут воздействовать на соответствующие удаляемому клиенту заказы из таблицы ORDER. Команда DELETE может быть обработана следующими способами:
Проверяется наличие заказов у удаляемого клиента и, если заказы есть, запрещается удаление клиента из таблицы CUSTOMER. Правило ссылочной целостности, запрещающее вставку, изменение или удаление строки, называется RESTRICT.
Клиент удаляется из таблицы CUSTOMER, и все соответствующие ему строки в таблице ORDER также автоматически удаляются. Правило ссылочной целостности, передающее изменение от одной таблицы к другой, называется CASCADE. При этом все заказы удаленного клиента теряются. Если эту информацию необходимо сохранить, можно переопределить триггер ссылочной целостности так, чтобы записать, например, эту информацию в архивную таблицу.
Клиент удаляется, но номеру клиента в таблице заказов автоматически присваивается нулевое значение. Правило ссылочной целостности, изменяющее текущее значение данных на нулевое, называется SET NULL.
Для генерации триггеров ERwin использует механизм шаблонов – специальных скриптов, использующих макрокоманды. При генерации кода триггера вместо макрокоманд подставляются имена таблиц, колонок, переменные и другие фрагменты кода, соответствующие синтаксису выбранной СУБД. Шаблоны триггеров ссылочной целостности, генерируемые Erwin, по умолчанию можно изменять, кроме того, можно переопределить как триггеры для конкретной связи, так и шаблоны во всей модели в целом.
Шаблоны триггеров ссылочной целостности связываются с сущностями в зависимости от типа связи и роли сущности в этой связи. Тип связи и роль сущности определяют, какое правило ссылочной целостности будет по умолчанию дополнено шаблоном триггера. Связи могут быть: идентифицирующими, неидентифицирующими (nulls allowed), неидентифицирующими (no nulls), связями подтипа.
Сущность в связи может быть родительская (Parent) или дочерняя (Child). Если сущность является родительской в данной связи, то ERwin присваивает ей шаблон триггера для родительской сущности. Если сущность является дочерней в данной связи, то ERwin присваивает ей шаблон триггера для дочерней сущности. Код триггера, который генерируется шаблоном триггера для родительской сущности, указывает СУБД, что нужно делать при вставке, изменении или удалении строки в родительской таблице связи. Код триггера, который генерируется шаблоном триггера для дочерней сущности, указывает СУБД, что нужно делать при вставке, изменении или удалении строки в дочерней таблице связи.
Ниже приведен текст шаблона триггера, соответствующего правилу ссылочной целостности ON PARENT DELETE RESTRICT.
/* ERwin Builtin %Datetime 7
/* %Parent %VerbPhrase %Child ON PARENT DELETE RESTRICT */ select count(*) into numrows
from %Child
where
/* %%JoinFKPK(%Child,:%%Old; ="," and") */
%JoinFKPK(%Child,:%Old," ="," and");
if (numrows > 0) then
raise_application_error(
–20001,
'Cannot DELETE %Parent because %Child exists.'
);
end if;
При генерации схемы СУБД для Oracle 7.2 будет сгенерирован триггер:
create trigger tD_CUSTOMER after DELETE on CUSTOMER for each row
– ERwin Builtin Tue Jan 26 21:55:13 1999
–DELETE trigger on CUSTOMER declare numrows INTEGER;
begin
/* ERwin Builtin Tue Jan 26 21:55:131999 7
/* CUSTOMER размещает ORDER ON PARENT DELETE RESTRICT */
select countf*) into numrows
from ORDER
where
/* %JoinFKPK(ORDER,:%Old," ="," and") */
ORDER.CustomerlD = :old.CustomerlD;
if (numrows > 0)
then
raise_application_error(
–20001,
'Cannot DELETE CUSTOMER because ORDER exists.'
):
end if;
ERwin по умолчанию использует для генерации кода триггера на языке SQL встроенные шаблоны триггеров ссылочной целостности, которые автоматически присваиваются каждой связи. Если встроенные шаблоны не удовлетворяют бизнес-правилам, можно изменить коды триггера, генерируемые на основе встроенных шаблонов. ERwin позволяет изменить шаблон и указать, что при генерации модифицированная версия должна заменить встроенный шаблон.
ERwin позволяет переопределить триггер, устанавливаемый по умолчанию, тремя способами:
Переопределение типа ссылочной целостности. Для каждой комбинации правил ссылочной целостности (например, Parent-Delete RESTRICT) ERwin позволяет создать переопределенный шаблон и использовать этот шаблон вместо шаблона, применяемого по умолчанию, для всех связей диаграммы, которым был присвоен этот тип правила ссылочной целостности. Используя в качестве основы встроенный код шаблона, можно изменить шаблоны ссылочной целостности во всей модели, изменяя коды триггера только в одном месте. Вновь определяемые шаблоны будут использоваться вместо стандартных шаблонов, если при генерации схемы включена опция RI Type Override.
Переопределение шаблона триггера для связи. Можно переопределить шаблон, задаваемый по умолчанию, для какой-то конкретной связи. Для этого используется диалог Relationship Template Editor, в котором можно описать шаблоны Relationship Override, применяемые вместо стандартных шаблонов (а также вместо шаблонов RI Type Override, если они есть). Шаблоны Relationship Override будут использоваться вместо стандартных шаблонов, если при генерации схемы включена опция Relationship Override.
Переопределение шаблона триггера для сущности. ERwin позволяет создавать собственные триггеры Entity Override для любой сущности в модели. Шаблоны Entity Override используются вместо стандартных шаблонов, а также вместо шаблонов RI Type Override и Relationship Override, если при генерации схемы включена опция Entity Override.
ERwin имеет специальные редакторы, облегчающие создание и редактирование триггеров и процедур.
Для редактирования триггера следует щелкнуть правой кнопкой мыши по таблице и выбрать во всплывающем меню пункт Trigger. Появляется диалог Table Trigger Viewer, в нижней части которого имеется две кнопки -Table Trigger и Trigger Template, которые вызывают диалоги, предназначенные для создания и редактирования пользовательских триггеров и шаблонов триггеров ссылочной целостности (рис. 2.78).
Рис. 2.78. Диалог Table Trigger Viewer
Рассмотрим простейший пример, в котором переопределим шаблон триггера для сущности. Предположим, бизнес-правила требуют, чтобы при любом изменении имени клиента (колонка CustomerName таблицы 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). Если имя не задано, ERwin генерирует триггеры ссылочной целостности по умолчанию. Кнопки New, Rename и Delete служат соответственно для внесения нового триггера в список, переименования и удаления триггера из списка.
Группа окон выбора Trigger On позволяет задать тип триггера – при каком событии триггер будет запускаться – при удалении Delete, вставке Insert или обновлении Update-строки таблицы. При выборе любого события ERwin автоматически формирует текст шаблона соответствующего триггера ссылочной целостности. Опции Before и After позволяют задать время выполнения триггера – до или после SQL-команд INSERT, UPDATE или DELETE. В примере на рис. 2.80 создается триггер, выполняемый до команды обновления UPDATE для колонки CustomerName таблицы CUSTOMER.
Опции Table и Row (поддерживается ORACLE 7.x, SQLBase V6, Watcom V4 и AS/400 V3) показывают, каким образом будет выполняться триггер. При генерации в текст триггера будут соответственно включены предложения "FOR EACH TABLE" или "FOR EACH ROW".
Old – ссылка на прежнее значение при обновлении поля, New – ссылка на новое значение при обновлении таблицы. В тексте шаблона триггера используется макрос %RefClause, при генерации текста триггера по шаблону включается предложение REFERENCES. В примере для нового значения установлено имя "newl", для старого – "oldl".
В списке в нижней части диалога показываются имена родительской таблицы (Parent), дочерней таблицы (Child), имя связи (Verb Phrase) и правило ссылочной целостности (Integrity Rule) в случае, если редактируется триггер ссылочной целостности.
В окне Template Code можно ввести код шаблона триггера. Код шаблона триггера, соответствующий бизнес-правилу рассматриваемого примера (создан на основе шаблона триггера ссылочной целостности), приведен ниже:
create trigger %TriggerName
%Fire %Actions(" or")
on %TableName
%RefClause
%Scope
/* ERwin Builtin %Datetime */ /* default body for %TriggerName */ begin
Insert into Security (OldName.NewName, UserUpdate, UpdateDate) values (:old1.CustomerName,:new1,CustomerName, User, Sysdate);
end;
/
В окне Expanded Code отображается код триггера (на языке выбранного сервера, в примере – Oracle 7.2), автоматически генерируемого по шаблону:
create trigger SecurWrite BEFORE UPDATE OF
CustomerName
on CUSTOMER
REFERENCING OLD AS old1 NEW AS new1
for each row
/* ERwin Builtin Tue Jan 26 21:24:371999 7
/* default body for SecurWrite 7
begin
Insert into Security (OldName.NewName, UserUpdate, UpdateDate)
values (:old1.CustomerName,:new1.CustomerName, User, Sysdate);
end;
/
Ниже приведен текст SQL-команд и результат их выполнения (выполнены при помощи Oracle SQVPlus), иллюстрирующих работу триггера.
SQL> insert into CUSTOMER (CustomerlD, CustomerName) values (20/lvanov');
1 row created.
SQL> update CUSTOMER set CuslomerName='Petrov' where CustomerlD=20;
1 row updated.
SQL> select* from SECURITY;
UPDATEDATE OLDNAME NEWNAME USERUPDATE
–
27-JAN-99 Ivanov Petrov SCOTT
Любое изменение имени клиента в таблице CUSTOMER фиксируется в таблице SECURITY, причем регистрируется прежнее значение имени, новое значение, дата изменения и имя пользователя, производившего изменения.
Кнопка Toolbox диалога Table Trigger Editor вызывает редактор ERwin Trigger Toolbox, который значительно облегчает создание текста шаблона триггера (рис. 2.81).
Рис. 2.81. Диалог ERwin Template Toolbox
Template Toolbox содержит три секции: слева расположены списки, содержащие макросы для таблиц, связей, колонок, ограничений и макросы общего назначения. Все макросы начинаются с символа %. Список макросов приведен в приложении. Если выделить макрос в каком-либо списке, в окне Description отобразится синтаксис макроса и пример его использования для связи между таблицами, показанными в правой секции редактора. Таблицы и связи, показываемые в правой части редактора, взяты из примера, содержащегося в файле MOVIES. ER1, который находится в директории Models.
Для включения макроса в текст шаблона достаточно дважды щелкнуть левой клавишей мыши по соответствующему макросу в одном из списков. Макрос включается в текст шаблона в окне Template Code диалога Table Trigger Editor.
Для изменения шаблона триггера ссылочной целостности (переопределение типа ссылочной целостности) служит редактор Trigger Template Editor (рис. 2.82).
Рис. 2.82. Диалог Trigger Template Editor
Для изменения шаблона нужно выделить тип триггера в списке, который находится в верхней части редактора, после чего щелкнуть по кнопке Detach ->, чтобы отсоединить тот шаблон, который связан с выбранным триггером. В списке Built-in Template или User Override нужно выбрать шаблон, который следует связать с выбранным триггером. Выделив имя шаблона, нужно щелкнуть по кнопке Attach над списком. ERwin свяжет выбранный шаблон с триггером и покажет его текст в окне Template Code. Для отмены связывания следует щелкнуть по кнопке <– Rebind. Для создания нового собственного шаблона надо задать его имя в окне Template Name и с помощью Trigger Toolbox (кнопка Trigger Toolbox”) создать текст шаблона триггера. Кнопка Add добавит новый шаблон в список User Override.