Процедура генерации модели данных для СУБД InterBase Windows InterActive SQL
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?звлекаются и раскрываются пользовательские свойства. В частности, %DiagramProp (IB_DBName) раскрывается в c:\ib\bd1.gdb, %DiagramProp (IB_UserName) - в SYSDBA, %DiagramProp (IB_Password) - в masterkey.
Нажмите на кнопку ОК.
Рис.
Проверка работоспособности скрипта. Сгенерируйте схему БД (Tasks/Forward Engineer/Schema Generation) и в окне предварительного просмотра (Preview) убедитесь в том, что в начале сценария добавились строки подключения к БД.
Замечание 4. Скрипт будет изменять содержание сценария только в том случае, когда на странице Options диалога Schema Generation будет установлен флажок для объекта Schema.
.3.2.2 Создание пользовательских свойств для обслуживания автоинкрементных полей таблиц
Генераторы и триггеры. Для реализации механизма обслуживания автоинкрементного поля необходимы два компонента: генератор уникального значения и триггер, который должен присваивать это значение при вставке новой записи в таблицу с автоинкрементным ключом.
Генераторы и триггеры создаются специальными запросами (CREATE GENERATOR и CREATE TRIGGER), которые должны быть расположены в сценарии создания БД после SQL-запросов создания таблиц (CREATE TABLE) для каждой таблицы, имеющей автоинкрементный ключ.
Запросы CREATE GENERATOR и CREATE TRIGGER могут быть созданы обычным способом в процессе редактирования текста сценария. Мы рассмотрим способ, основанный на использовании механизмов пользовательских свойств и шаблонов. Этот способ особенно эффективен при большом числе таблиц, содержащих автоинкрементные поля [6].
Создание признаков, идентифицирующих автоинкрементные атрибуты модели. Чтобы отличать таблицы, содержащие автоинкрементные атрибуты, создадим для соответствующих сущностей специальное пользовательское свойство, которое будет служить признаком.
Рис.
Перейдите в режим логической схемы и выберите пункт Edit/UDPs. В диалоге свойств установите в списке Class объект Attribute. Создайте свойство, например, с именем generate_id типа List и назначьте ему значения по умолчанию "yes, ~no" (рис.2.9).
Перейдите в редактор атрибутов модели (Edit/Attribute). Теперь значение "no" пользовательского свойства generate_id видно у всех атрибутов модели. Поменяйте это значение на "yes" у генерируемых автоинкрементных ключевых атрибутов (рис. 2.10).
После того, как автоинкрементные атрибуты помечены, необходимо создать шаблон и подключить его к указанным таблицам.
SQL-запросы для создания генераторов и триггеров. Договоримся, что генераторы мы будем называть по имени поля с прибавлением строки "_gen". Например, если таблица PART_TYPE содержит поле equip_type_id, значение которого должен давать генератор, то имя этого генератора будет equip_type_id_gen. SQL-запрос на создание генератора для этого поля будет иметь вид: CREATE GENERATOR equip_type_id_gen;
Пусть также имена триггеров образуются от имен триггера для таблиц с добавлением "_GEN_ID". Тогда имя триггера для таблицы PART_TYPE будет PART_TYPE_GEN_ID, а запрос на создание триггера:
SET TERM!!TRIGGER PART_TYPE_GEN_ID FOR PART_TYPEINSERT AS.equip_type_id = gen_id (equip_type_id_gen,1);!!
Рис.
SET TERM;!!
Создание шаблона для обслуживания автоинкрементных полей таблиц. Для рассматриваемого примера механизм шаблонов очень удобен, так как при создании схемы БД необходимо генерировать однотипные скрипты, сопровождающие таблицы, содержащие автоинкрементные поля. На этот раз скрипт должен иметь тип "после генерации", так как он будет содержать запрос на создание триггера, а таблица, к которой этот триггер относится, должна уже существовать.
Перейдите в режим физической модели, выберите пункт Edit/Table и щелкните по закладке Pre & Post Script. Эта страница практически совпадает с одноименной страницей редактора, рассмотренного ранее (рис. 2.7).
Щелкните по кнопке "Script Template" и перейдите в редактор шаблонов уже рассмотренный нами выше.
Создайте новый скрипт, назвав его "Создание генератора". В окне Table Script Template наберите следующий текст шаблона:
%For EachAtt (%TableName)
{
% if (% = = (%AttProp (generate_id), yes))
{CREATE GENERATOR % AttFiledName_gen;TERM MS TriggerDelim;TRIGGER %TableName_GEN_ID FOR %TableName.%AttFiledName = gen_id (%AttFiledName_gen,1);MS TriggerDelimTERM; MS TriggerDelim
}
}
Замечание. Нажмите кнопку ОК. Имя созданного шаблона должно появиться в правом списке - списке неподключенных скриптов.
Анализ текста шаблона. Как и в обычном языке программирования в макроязыке ERwin имеются макросы - операторы цикла, условные операторы и операторы сравнения. Например, для организации цикла-перебора всех атрибутов таблицы служит макрос
%ForEachAtt (%TableName)
{...}
Все находящееся в фигурных скобках, будет выполняться для каждого атрибута таблицы %TableName. Макрос %TableName при "раскрытии" шаблона разворачивается в имя таблицы, то есть таблицы (из списка таблиц), к которой данный шаблон подключен.
Условный макрос
% if (% = = (%AttProp (generate_id), yes))
{...}
В качестве логического выражения в данном случае используется макрооператор сравнения % = =. Принцип работы приведенного фрагмента шаблона заключается в следующем: проверяется, равно ли у атрибута значение свойства generate_id = yes, и если равно, то выполняется все, что находится в фигурных скобках, то есть создается генератор и триггер.
Макрос %AttProp (generate_id) извлекает значение свойства "generate_id", подключенное к атрибуту, а %AttFiledName разворачивается в имя колонки таблицы, соответствующей атрибуту сущности.
И, наконец, в шаблоне имеется макроопределение MS TriggerDelim, заменяющееся при обработке шаблона в разделитель триггера "!!". Эта последовательность символо