WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |   ...   | 14 |

• Generate - запускает процесс ге- нерации физической схемы БД. В диалоге с БД (рис. 33) необходимо ввести login и password, если это требуется. В выпадающем списке «Database» сле- дует выбрать имя БД или оdвс-драйвера.

После нажатия кнопки «Connect» появится диалог Generate Database - Schema. Для продолжения процесса генерации следует нажать кнопку «Continue».

А теперь можно сгенерировать схему нашей БД. Для этого выберите пункт главного меню «Tasks/Forward Engineer/Schema Generation...».

В диалоговом окне генератора схем на странице «Options» выделите в ле- вом списке объект «Trigger» и уберите все флажки в правом списке. Нажмите «Preview». В окне просмотра появится следующий SQL-скрипт создания БД:

CONNECT 'e:\ib\courses.gdb' USER '' PASSWORD '' CREATE DOMAIN t_god_rozhd DATE;

CREATE DOMAIN t_ball INTEGER;

CREATE DOMAIN tchasov INTEGER;

CREATE DOMAIN t_chislo_semestrov INTEGER;

CREATE DOMAIN t_group_id INTEGER;

CREATE DOMAIN t_kafedra_id INTEGER;

CREATE DOMAIN t_kolich_student INTEGER;

CREATE DOMAIN t_ocenka INTEGER;

CREATE DOMAIN t_predmet_id INTEGER;

CREATE DOMAIN t_student_id INTEGER;

CREATE DOMAIN t_tab_nomer INTEGER;

CREATE DOMAIN t_address VARCHAR(20);

CREATE DOMAIN t_kafedra_name VARCHAR(20);

CREATE DOMAIN tlastf_mname VARCHAR(20) CREATE DOMAIN t_predmetname VARCHAR(20);

CREATE DOMAIN t_progr_cours VARCHAR(20);

CREATE DOMAIN ttelephone VARCHAR(20);

CREATE DOMAIN t_uch_stepen VARCHAR(20);

CREATE DOMAIN t_uch_zvanie VARCHAR(20);

CREATE DOMAIN t_vid_zaniatiya VARCHAR(20) CREATE TABLE ADVANCING student_id t_student_id NOT NULL, group_id t_group_id NOT NULL, predmet_id t_predmet_id NOT NULL, tab_nomer t_tab_nomer NOT NULL, vid_zaniatiya t_vid_zaniatiya NOT NULL, ocenka t_ocenka CREATE UNIQUE INDEX XPKADVANCING ON ADVANCING ( student_id, group_id, predmet_id, tab_nomer, vid_zaniatiya - 44- CREATE INDEX XIFlOADVANCING ON ADVANCING ( student_id, group_id ) ;

CREATE INDEX XIF14ADVANCING ON ADVANCING ( groupid, predmet_id, tab_nomer, vid_zaniatiya ) ;

ALTER TABLE ADVANCING ADD PRIMARY KEY (student_id, group_id, predmet_id, tab_nomer, vid_zaniatiya);

CREATE TABLE CATHEDRA( kafedra_id t_kafedra_id NOT NULL, kafedra_name t_kafedra_name, last_f_m_name t_last_f_m_name, telephone ttelephone ) ;

CREATE UNIQUE INDEX XPKCATHEDRA ON CATHEDRA ( kafedraid );

ALTER TABLE CATHEDRA ADD PRIMARY KEY (kafedra_id);

CREATE TABLE GROUP ( group_id t_group_id NOT NULL, kolich_student tkolich_student, ball t_ball ) ;

CREATE UNIQUE INDEX XPKGROUP ON GROUP ( group_id ) ;

ALTER TABLE GROUP ADD PRIMARY KEY (group_id);

CREATE TABLE STUDENT ( student_id t_student_id NOT NULL, group_id t_group_id NOT NULL, last_f_m_name t_last_f_m_name, godrozhd tgod_rozhd, address t_address, ball t_ball ) ;

CREATE UNIQUE INDEX XPKSTUDENT ON STUDENT - 45- ( student_id, group_id );

CREATE INDEX XIF8STUDENT ON STUDENT ( group_id ) ;

ALTER TABLE STUDENT ADD PRIMARY KEY (student_id, group_id);

CREATE TABLE STUDYING ( group_id t_group_id NOT NULL, predmet_id t_predmet_id NOT NULL, tab_nomer t_tab_nomer NOT NULL, vid_zaniatiya t_vid_zaniatiya NOT NULL, chasov t_chasov ) ;

CREATE UNIQUE INDEX XPKSTUDYING ON STUDYING groupid, predmet_id, tabnomer, vidzaniatiya ) ;

CREATE INDEX XIF11STUDYING ON STUDYING ( group_id );

CREATE INDEX XIF12STUDYING ON STUDYING ( predmet_id );

CREATE INDEX XIF13STUDYING ON STUDYING ( tab_nomer ) ;

ALTER TABLE STUDYING ADD PRIMARY KEY (group_id, predmet_id, tab_nomer, vid_zaniatiya);

CREATE TABLE SUBJECT ( predmet_id t_predmet_id NOT NULL, predmet_name t_predmet_name, chasov t_chasov, chasov t_chasov, chasov t_chasov, - 46- chislosemestrov t_chislo_semestrov, progr_cours t_progr_cours );

);

CREATE UNIQUE INDEX XPKSUBJECT ON SUBJECT ( predmet_id ) ;

ALTER TABLE SUBJECT ADD PRIMARY KEY (predmet_id);

CREATE TABLE TEACHER ( tab_nomer t_tab_nomer NOT NULL, kafedra_id t_kafedra_id, last_f_m_name t_last_f_m_name, uch_stepen t_uch_stepen, uch_zvanie t_uch_zvanie ) ;

CREATE UNIQUE INDEX XPKTEACHER ON TEACHER ( tab_nomer ) ;

CREATE INDEX XIF9TEACHER ON TEACHER ( kafedra_id );

ALTER TABLE TEACHER ADD PRIMARY KEY (tab_nomer);

ALTER TABLE ADVANCING ADD FOREIGN KEY (group_id, predmet_id, tab_nomer, vid_zaniatiya) REFERENCES STUDYING;

ALTER TABLE ADVANCING ADD FOREIGN KEY (student_id, group_id) REFERENCES STUDENT;

ALTER TABLE STUDENT ADD FOREIGN KEY (group_id) REFERENCES GROUP;

ALTER TABLE STUDYING ADD FOREIGN KEY (tab_nomer) REFERENCES TEACHER;

ALTER TABLE STUDYING ADD FOREIGN KEY (predmet_id) REFERENCES SUBJECT;

ALTER TABLE STUDYING ADD FOREIGN KEY (group_id) REFERENCES GROUP;

— 47 — ALTER TABLE TEACHER ADD FOREIGN KEY (kafedra_id) REFERENCES CATHEDRA;

В приведенном скрипте можно выделить несколько групп SQL-запросов:

Создание доменов. Это группа SQL-запросов CREATE DOMAIN. Они генери- руются для всей модели, если в опциях для объекта «Schema» установлен фла- жок «CREATE DOMAIN».

Создание таблиц. Для каждой таблицы, входящей в текущее подмножест- во модели, генерируются запросы, заданные в опциях объекта Table. В данном случае это:

CREATE TABLE - создание таблицы;

CREATE INDEX - создание индекса для первичного ключа;

ALTER TABLE... ADD PRIMARY KEY - добавление первичного ключа;

ALTER TABLE... ADD FOREIGN KEY - добавление внешнего ключа.

2.2.5. КОД ПОДКЛЮЧЕНИЯ К БД Этот сценарий будет выполнен в программе windows ISQL (File\Run an ISQL script...), поэтому сценарий должен начинаться с команд подключе- ния к БД:

CONNECT <файл базы> USER <имя пользователя> PASSWORD <пароль> Добавим эти команды в начале сценария. Внесем в схему текстовые пара- метры — имя файла БД, имя пользователя и пароль, чтобы их можно было ис- пользовать при генерации схемы. Для этого воспользуемся реализованным в ERwm механизмом пользовательских свойств.

Рис. 34. Страница пользовательских свойств диаграммы - 48- Выберите «Edit\Diagram...» и перейдите на страницу «UDP» (рис. 34).

Затем нажмите OK и перейдите в редактор пользовательских свойств (рис. 35).

В списке «class» выбирается объект диаграммы, для которого задаются пользовательские свойства. В данном случае объектом является сама диаграмма, поэтому в поле стоит «Diagram».

Рис. 35. Редактор пользовательских свойств Добавление пользовательского свойства производится с помощью кнопки «+» таблицы свойств. Кроме этого таблица свойств содержит колонки:

• Name — имя пользовательского свойства;

• Туре - тип данных свойства. Определены следующие типы данных:

> Command - выполняемая строка, например, C:\MSOFFICE\ WINWORD.EXE D:\TUTORIAL\README.DOC;

> Data -дата;

> int - целое число;

> Real - действительное число;

> Text - символьная строка;

> List - список.

• Default- значение свойства по умолчанию;

• Description - описание свойства.

Введите в таблицу три свойства текстового типа: IB_DBName, IB_User_ Name, IB_Password и нажмите ок. После этого введите значения этих свойств.

На рис. 36 файл БД сервера InterBase (свойство IB_DBName) имеет полное имя «Е: \IB\COURSE.GDB», В качестве login (СВОЙСТВО IB_User_Name) - «STUDENT», а пароля (свойство IBPassword) - «silver».

Теперь необходимо в начале генерируемого скрипта программно дописать команды подключения к базе. Для этого воспользуемся тем, что ERwin позволя- ет назначить каждому объекту диаграммы специальные шаблоны, написанные на встроенном макроязыке. Выберите «Server\InterBase Schema Property...». Диалоговое окно «Schema Property Editor» содержит две стра- ницы (см. рис. 37):

• stored Procedure - на этой странице схема связывается с шаблонами -49- хранимых процедур, которые генерируются при генерации схемы;

• Pre & Post Script - на этой странице задаются скрипты, генерируемые при генерации схемы в целом.

Рис. 36. Пользовательские свойства ER-диаграмм Для генерации команд подключения воспользуемся сценарием «до генера- ции», поэтому перейдите на страницу «Pre & Post Script» и нажмите Рис. 37. Подключение шаблона сценария к схеме «Schema Script Template...».

-50- Для добавления шаблона, нажмите кнопку New и введите в диалоге имя «Подключение к БД». Введенное имя появится в колонке Script Template Name (рис. 38), в колонке Туре указывается «Рге» (этот тип можно поменять с помощью переключателя «Generation Option»,), а в колонке «Code» выводит- ся первая с трока кода шаблона. Полный текст шаблона вводится в дополни- тельном окне «Schema Script Template», которое представляет собой обыч- ный текстовый редактор (см. рис. 38).

Рис. 38. Добавление шаблона сценария к схеме Наберите следующий текст шаблона:

CONNECT ' %DiagramProp (IB_DBName)' USER '%DiagramProp (IB_UserName)' PASSWORD '%DiagramProp (IB_Password)';

При вводе текста шаблона можно вызвать на экран вспомогательное окно «Template Toolbox» (рис. 39).

В левой части диалогового окна находятся списки, содержащие имена мак- росов, относящихся к:

• сущностям (Entity Macro);

• связям (Relationship Macro);

• атрибутам (Attribute Macro);

• ограничениям (Constrain Macro);

• макросы общего назначения (Miscellaneous Macro).

В центральной части в окне «Description» выводится синтаксис выделен- ного макроса и пример его использования для фрагмента схемы, приведенного в правой части диалога. Если дважды щелкнуть по выбранному имени макроса, то оно будет вставлено в редактируемый текст.

-51- Нажмите ОК в редакторе «Schema Script Template Editor» и вернитесь в редактор свойств схемы, в верхней части которого имеется два списка - под- ключенных скриптов (Attached Script) и неподключенных скриптов (Unat- tached Script). Написанный нами шаблон появился в правом списке, но он еще не подключен к схеме и его необходимо подключить. Для этого выделите его в схеме и нажмите на кнопку «Attach». При этом имя шаблона перемес- тится в левый список, в окне Script Template появится текст шаблона, вве- денный ранее (см. рис. рис. 37), а в окне Script Expansion выводится резуль- тат работы шаблона:

CONNECT ' d:\ib\course.gdb' USER 'STUDENT' PASSWORD 'silver';

Рис. 39. Вспомогательное окно Template Toolbox В этом скрипте мы воспользовались макросом %DiagramProp (), который позволяет извлечь значение пользовательского свойства, заданного в диаграм- ме, по его имени. В макроязыке ERwin имеются макросы для извлечения значе- ний свойств, приписанных к любым объектам модели.

Нажмите ОК и сгенерируйте схему БД (Tasks\Forward Engineer\Schema Generation..). В окне предварительного просмотра и убедитесь, что в начале сценария добавились строки подключения к БД.

2.2.6. ГЕНЕРАТОРЫ И ТРИГГЕРЫ В нашей модели имеются поля, введенные в качестве первичного ключа.

Эти поля должны содержать генерируемые автоматически уникальные для таб- лицы целые числовые значения. Для реализации этой задачи необходимы два - 52- компонента: генератор уникального значения и триггер, который присваивал это значение при вставке новой записи.

Для создания генератора в языке SQL предусмотрен запрос CREAT E GENE- RAT OR, а для присвоения уникального значения первичному ключу - запрос CREAT E T RIGGER. Примем правило, что генераторы будем называть по имени поля с прибавлением строки «_gen». Например, запрос на создание генератора для поля kod_group будет иметь вид CREATE GENERATOR kod_group_gen;

Такое же правило примем относительно имен триггеров, которые образу- ются от имени таблиц с добавлением «GEN_ID». Тогда имя триггера для таб- лицы GROUPS будет GROUP S_GEN_ID, а запрос на создание триггера:

SET TERM !!;

CREATE TRIGGER GROUPS_GEN_ID FOR GROUPS BEFORE INSERT AS BEGIN new.kod_group =gen_id(kod_group_gen,1);

END !! SET TERM; !! Такие запросы должны быть в сценарии создания БД после SQL-запросов создания таблиц CREAT E T ABLE для каждой таблицы, имеющей автоинкремент- ный ключ.

А теперь для всех атрибутов создадим специальное пользовательское свой- ство (UDP), которое будет служить признаком генерирования значений. Для этого перейдите в режим логической схемы и выберите пункт меню «Edit\UDPs...»..

В диалоге свойств установите в списке «Class» объект «Attribute», соз- дайте свойство с именем «generate_id» типа «List» и назначьте ему значе- ния по умолчанию «yes_no» (рис. 40).

Рис. 40. Свойство generate_id - признак автоинкрементного поля Это пользовательское свойство будет видно у всех атрибутов модели, а значение его по умолчанию будет равно «nо». Для генерируемых ключевых атрибутов поменяйте это значение на «yes» (см. рис. 41).

Перечень ключевых автоинкрементных атрибутов приведен в табл. 11.

Итак мы пометили автоинкрементные атрибуты, теперь необходимо создать 53- шаблон и подключить его к указанным таблицам. Для этого перейдите в режим физической модели, выберите «Edit\Table...» и щелкните по закладке «Pre&Post Script».

Рис. 41. Установка значения свойства generate_id Необходимо в этом редакторе создать скрипт и подключить к таблице.

На этот раз скрипт должен иметь тип «после генерации», так как он будет содержать запрос на создание триггера, а таблица, к которой этот триггер от- носится, должна уже существовать.

Табл. 11. Ключевые автоинкрементные атрибуты ТАБЛИЦА КЛЮЧЕВОЙ АТРИБУТ ! СУЩНОСТЬ GROUPS kod_group Группы Студенты STUDENTS kod_student Кафедры KATHEDRS kod_kathedra Преподаватели TEACHERS kod_teacher Предметы SUBJECTS kod_subject Изучение STUDYING vid_zaniatia Успеваемость RATING Щелкните по кнопке «Script Template» и перейдите в редактор шабло- нов, уже рассмотренный выше. Создайте новый скрипт с названием «Создание генератора». Для ЭТОГО В окне «Table Script Template» наберите следую- щий текст:

-54- %ForEachAtt(%TableName) { if (%==(%AttProp(generate_id),yes)) { CREATE GENERATOR %AttFieldName_gen;

SET TERM %DBMSTriggerDelim;

CREATE TRIGGER %TableName_GEN_ID FOR %TableName BEFORE INSERT AS BEGIN new.%AttrFieldName=gen_id (%AttrFieldNamegen, 1) ;

END %DBMSTriggerDelim SET TERM; %DBMSTriggerDelim } } Проверьте, чтобы «Generation Option» был ус тановлен в положении «PostTableCreation» и нажмите OK (рис. 42). Созданный скрипт должен поя- виться в правом списке - списке неподключенных скриптов. Для переноса в список подключенных скриптов выберите его и нажмите кнопку «Attach», за- тем выберите в выпадающем списке следующую таблицу и т. д.

Рис. 42. Создание скрипта А теперь рассмотрим текст шаблона. Встроенный в ERwin макроязык со- держит около 200 макросов, имена которых начинаются с символа «%». В тек- сте использован макрос %AttProp (generate_id), который извлекает значение свойства «generate_id», подключенного к атрибуту.

В макроязыке ERwin имеются макросы-операторы цикла, условные опера- торы и операторы сравнения. Например, для организации цикла - перебора всех атрибутов таблицы служит макрос - 55- %ForEachAtt (%TableName) {... } Согласно данной конструкции, все, что находится в {...}, будет выпол- няться для каждого атрибута таблицы %TableName. Макрос %TableName при раскрытии шаблона разворачивается в имя текущей таблицы.

Условный макрос %if (% == (%AttProp(generate_id), yes)) {... } является аналогом условного оператора if. Здесь проверяется равенство свой- ства generate_id у атрибута значения «yes», и если оно равно, то выполняет- ся все, что находится в фигурных скобках.

В шаблоне используется также макроопределение имени поля %AttFieldName_gen, разворачивающееся в имя поля, соответствующее атри- буту. Например, атрибуту «kod_group» соответствует поле «kod_group_gen».

В тексте шаблона используется также макрос %DBMSTriggerDelim, кото- рый заменяется при обработке шаблона в разделитель триггера - «! !». Это значение было определено в диалоге «Target Server» в поле «Trigger Delimiter».

Теперь можно проверить результаты проведенной работы. Для этого вый- дите из редактора таблиц «Interbase Table Editor» и выполните генерацию схемы базы данных. В режиме просмотра можно убедиться, что после SQL - за- просов создания таблиц CREAT E T ABLE появились строки создания генераторов и триггеров. Например, часть сценария, относящаяся к таблице GROUPS, выгля- дит теперь следующим образом:

Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |   ...   | 14 |






















© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.