WWW.DISSERS.RU

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

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


Pages:     | 1 |   ...   | 4 | 5 || 7 | 8 |   ...   | 14 |

CREATE TABLE GROUPS ( kod_group t_nomer NOT NULL, kol_students t_kolichestvo, name_group t_nomer, sredniy_ball t_sredniy_ball ) ;

CREATE UNIQUE INDEX XPKGROUPS ON GROUPS ( kod_group );

ALTER TABLE GROUPS ADD PRIMARY KEY (kod_group);

CREATE GENERATOR kod_group_gen;

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 ; !! - 56- 2.2.7. ХРАНИМЫЕ ПРОЦЕДУРЫ Рассмотренный механизм шаблонов очень удобен, когда при генерации схемы требуется повторить одну и ту же операцию для нескольких объектов модели. Далее мы будем создавать хранимые процедуры вставки, изменения и удаления записей, которые будут иметь одинаковую структуру для всех таблиц.

Поэтому для хранимых процедур можно создать шаблоны для вставки, измене- ния и удаления записей, а затем использовать их для всех таблиц базы.

Запрос на создание процедуры вставки записи имеет вид SET TERM !! ;

CREATE PROCEDURE <имя процедуры> (<параметр тип>,...) AS BEGIN INSERT INTO <имя таблицы> (<имя поля>, <имя поля>...) VALVES (<: параметр>, <: параметр>...) END ! ! SET TERM ; !! Здесь SQL-выражение SET TERM устанавливает в качестве разделителя по- следовательность символов « ! !», а при окончании процедуры возвращает ста- рое значение разделителя «;».

Примем правило, согласно которому имя процедуры образуется от имени таблицы, путем добавления перед ним префикса «ins_». Параметрами проце- дуры будут все поля таблицы, кроме автоинкрементного поля, значение кото- рого генерируется триггером.

Для таблицы GROUPS процедура вставки создается следующим запросом SET TERM !! ;

CREATE PROCEDURE ins_groups (name_group CHAR(30), kol_students SMALLINT, sredniyj_ball SMALLINT) AS BEGIN INSERT INTO PART_TYPE (equip_name,kol_students,sredniy_ball) VALUES ( : equipname, : kol_students, : sredniy_ball) ;

END ! ! SET TERM ; !! Процедура изменения записи таблицы имеет вид SET TERM !! ;

CREATE PROCEDURE <имя процедуры> (<параметр тип>,...) AS BEGIN UPDATE <имя таблицы> SET <имя поля> = <:параметр>, <имя поля> = <:параметр>...

WHERE <ключ> = <параметр> AND <ключ> = <параметр>... ;

END ! ! SET TERM ; !! Как и в предыдущем случае, имя этой процедуры создадим из имени табли- цы, добавив к нему префикс «upd». В отличие от предыдущей процедуры, па- раметры здесь должны содержать и ключевое поле, по которому устанавливается - 57- условие в запросе UPDATE. Применительно к таблице GROUPS процедура выгля- дит так:

SET TERM !! ;

CREATE PROCEDURE upd_groups (kod_group SMALLINT, name_group CHAR(30), kol_students SMALLINT, sredniy_ball SMALLINT)) AS BEGIN UPDATE GROUPS SET name_group =: name_group, kol_students =: kol_students, sredniy_ball =: sredniy_ball WHERE kod_group =: kod_group;

END ! ! SET TERM ; !! Процедура удаления содержит в качестве параметров только ключевые ре- квизиты и имеет вид SET TERM !! ;

CREATE PROCEDURE del_groups (kod_group SMALLINT) AS BEGIN DELETE FROM GROUPS WHERE kodgroup =: kodgroup;

END ! ! SET TERM ; !! Для создания шаблонов и привязки их к таблицам вызовите редактор «Table Editor» набрав пункт главного меню «Edit/Table...». В вызван- ном редакторе перейдите на страницу «Stored Procedure»:

• нажмите на кнопку «SP Template» и перейдите в редактор шаблонов «Template Editor»;

• создайте в редакторе три шаблона, назвав их «Вставка записи», «Измене- ние записи» И «Удаление записи»;

• введите тексты шаблонов, приведенные ниже.

Вставка записи SET TERM %DBMSTriggerDelim;

CREATE PROCEDURE ins_%Lower(%TableName) (%ForEachAtt(%TableName,',') { %if (%Not(%AttIsPK)) {%AttFieldName %AttDataType } } ) AS BEGIN INSERT INTO (%ForEachAtt(%TableName,',') {%if (%Not(%AttIsPK)) {%AttFieldName} } ) VALUES (%ForEachAtt(%TableName,',') {%if (%Not(%AttIsPK)) {:%AttFieldName} } );

END%DBMSTriggerDelim SET TERM ; %DBMSTriggerDelim - 58- Изменениезаписи SET TERM %DBMSTriggerDelim ;

CREATE PROCEDURE upd%Lower (%TableName) (%ForEachAtt(%TableName,',') {%AttFieldName %AttDataType}) AS BEGIN UPDATE %TableName SET %ForEachAtt(%TableName,',') {%if (%Not (%AttIsPK) ) {%AttFieldName=:%AttFieldName} } WHERE %ForEachAtt(%TableName,' AND ') {%if (%AttIsPK) {%AttFieldName=:%AttFieldName} };

END%DBMSTriggerDelim SET TERM ; %DBMSTriggerDelim Удаление записи SET TERM %DBMSTriggerDelim;

CREATE PROCEDURE del_%Lower(%TableName) (%ForEachAtt(%TableName,',') {%if (%AttIsPK) {%AttFieldName %AttDataType } } ) AS BEGIN DELETE FROM %TableName WHERE %ForEachAtt(%TableName, ' AND ') {%if (%AttIsPK) {%AttFieldName=:%AttFieldName }};

END%DBMSTriggerDelim SET TERM ; %DBMSTriggerDelim • вернитесь в редактор таблиц и подключите созданные шаблоны к табли- цам: GROUPS, STUDENTS, KATHEDRAS, TEACHERS, SUBJECTS, STUDYING.

2.2.8. ИНДЕКСЫ Для повышения скорости извлечения данных и обеспечения условия уни- кальности значений в базах данных используется механизм индексации. При выполнении запроса СУБД в первую очередь проверяет, существуют ли подхо- дящие индексы у таблиц, участвующих в запросе. Затем СУБД определяет, что будет эффективнее - использовать индексы или выполнять последовательный просмотр записей. Если принимается решение об использовании индекса, в ин- дексе находится необходимое значение и по ссылкам, связанным с этим значе- нием, находятся нужные строки таблицы. Извлечение данных с помощью ин- декса быстрее, т. к. индекс упорядочен и имеет небольшой размер.

Но, индексы увеличивают объем базы данных, а также время вставки, уда- ления и изменения данных, содержащих индексные колонки, т. к. при этом не- обходимо изменять индексы. Но выигрыш в скорости от применения индексов намного превышает эти недостатки.

Создание индексов целесообразно в следующих случаях:

• колонка часто используется в условиях поиска;

• колонка участвует в условиях соединения JOIN;

-59- • по колонке производится сортировка.

ERwin содержит средства для создания индексов в проектируемой модели.

На логическом уровне индексы представлены ключевыми группами (Key- Group) или ключами, при переходе к физической модели ключевые группы преобразуются в индексы. Ключевые группы могут быть следующих типов:

• первичный ключ (Primary Key) — однозначно идентифицирует экземпляр сущности;

• альтернативный ключ (Alternate Key) - это потенциальный ключ, не выбранный в качестве первичного. ERwin позволяет выделять атрибуты потен- циальных ключей и при генерации схемы базы данных генерировать по этим группам отдельные уникальные индексы.

• внешний ключ (ForeignKey) - создается в дочерней сущности при внесе- нии в диаграмму связи и включает в себя мигрирующие атрибуты родительской сущности;

• инверсионные входы (inversion Entry) - атрибуты или группы атрибу- тов, не определяющие экземпляр сущности уникальным образом, но час то ис- пользующиеся для обращения к экземплярам сущности. Классическим приме- ром инверсного входа является атрибут «Фамилия» в таблицах, а в нашей базе данных ключом этого типа является атрибут «kod_student» таблицы STUDENTS.

Рис. 43. Редактор ключевых групп - 60- B ERwin можно редактировать ключевые группы. Для этого предусмотрен редактор ключевых групп (рис. 43), вызываемый путем выбора пункта «Edit / Key Group...» главного меню. Перейдите в режим логической модели и выбе- рите пункт «Edit/Key Group...». Редактор содержит следующие элементы управления:

• Entity (сущность) - поле с выпадающим списком, в котором выбираетс я сущность для редактирования;

• Key Group — окно с перечнем ключевых групп. Группы представлены строками, включающими в себя имя (Key Group), тип (Туре) и определение ( Definition) ;

• флажок Show FK Groups, обеспечивает включение режима вывода внеш- них ключей в перечне.

• Кроме этого редактор ключевых групп содержит следующие страницы с закладками:

• Members - для задания ключевых групп и порядка их следования в группе;

• General — содержит переключатели, позволяющие задавать тип ключевой группы (для первичного и внешнего ключа эти опции не доступны);

• Definition - предназначена для набора произвольной текстовой инфор- мации, относящейся к выбранной ключевой группе;

• Note — предназначена для набора примечания к выбранной группе;

• UDP - предназначена для установки пользовательских свойств для выбран- ной группы.

Рис. 44. Диалог ввода новой ключевой группы Рассмотрим процесс редактирования ключевой группы на примере атрибу- та «название предмета». Выберите В списке сущность «Единица оборудова- ния» и нажмите «New» (рис. 44). Введите имя ключевой группы в поле «Key Group» — «Название предмета». При этом в поле «Index» выводится генери- руемое ERwin имя индекса, которое следует оставить без изменений.

С помощью переключателя «Key Group Type» задается тип создаваемого ключа. Это может быть Alternate Key или Inversion Entry. Выберите -61- Inversion Entry и нажмите ок. После этого введенный альтернативный ключ появится в перечне ключей.

Затем перейдите на страницу «Members», выберите в левом списке атрибут «Название предмета» и переместите его в правый список.

Теперь, для того, чтобы при генерации схемы базы генерировались все не- обходимые нам индексы, следует в диалоге генерации для объекта «index» ус- тановить все флажки (рис. 45).

Рис. 45. Флажки группы «Create Index» диалога генерации схемы Сгенерируйте SQL - скрипт создания базы данных и сохраните его в файл.

CONNECT 'e:\ib\courses.gdb' USER 'STUDENT' PASSWORD 'silver' CREATE DOMAIN t_time DATE;

CREATE DOMAIN t_install_date DATE;

CREATE DOMAIN t_workday DATE;

CREATE DOMAIN t_equip_id INTEGER;

CREATE DOMAIN t_class_id INTEGER;

CREATE DOMAIN t_equip_type_id INTEGER;

CREATE DOMAIN t_workplace_id INTEGER;

CREATE DOMAIN t_workhour_id INTEGER;

CREATE DOMAIN t_malfunct INTEGER;

CREATE DOMAIN t_is_section INTEGER;

-62- CREATE DOMAIN t_ip_address VARCHAR(20);

CREATE DOMAIN t_address VARCHAR(20);

CREATE DOMAIN t_workplace_name VARCHAR(20);

CREATE DOMAIN t_inventoryno VARCHAR (20);

CREATE DOMAIN t_equip_name VARCHAR(20);

CREATE DOMAIN t_audit_no VARCHAR(20);

CREATE DOMAIN t_corpus_no VARCHAR(20);

CREATE DOMAIN tworkplace_no VARCHAR(20);

CREATE DOMAIN t_note VARCHAR(20);

CREATE DOMAIN t_telephone VARCHAR(20);

CREATE DOMAIN t_techinfo VARCHAR(20);

CREATE TABLE CLASS ( classid t_class_id NOT NULL, address t_address, corpus no t_corpus_no, audit_no t_audit_no, telephone t_telephone, note t_note ) ;

CREATE UNIQUE INDEX XPKCLASS ON CLASS ( class_id ) ;

ALTER TABLE CLASS ADD PRIMARY KEY (class_id);

CREATE GENERATOR class_id_gen;

SET TERM !! ;

CREATE TRIGGER CLASS_GEN_ID FOR CLASS BEFORE INSERT AS BEGIN new.class_id = gen_id(class_id_gen, 1);

END ! ! SET TERM ; !! CREATE TABLE PART ( equip_id t_equipid NOT NULL, workplace_id t_workplace_id, equip_type_id t_equip_type_id NOT NULL, inventory_no t_inventory_no, techinfo t_techinfo, malfunct t_malfunct, installdate t_install_date, note t_note ) ;

CREATE UNIQUE INDEX XPKPART ON PART ( equip_id ) ;

CREATE INDEX XIF2PART ON PART ( workplace_id -63- ) ;

CREATE INDEX XIF6PART ON PART ( equip_type_id ) ;

ALTER TABLE PART ADD PRIMARY KEY (equip_id);

CREATE GENERATOR equip_id_gen;

SET TERM !! ;

CREATE TRIGGER PART_GEN_ID FOR PART BEFORE INSERT AS BEGIN new.equip_id = gen_id (equip_id_gen, 1);

END !! SET TERM ; !! CREATE GENERATOR equip_type_id_gen;

SET TERM !! ;

CREATE TRIGGER PART_GEN_ID FOR PART BEFORE INSERT AS BEGIN new. equip_type_id = genid (equip_type_id_gen, 1);

END ! ! SET TERM ; !! CREATE TABLE GROUPS ( equip_type_id t_equip_type_id NOT NULL, equip_name t_equip_name ) ;

CREATE UNIQUE INDEX XPKGROUPS ON GROUPS ( equip_type_id );

ALTER TABLE GROUPS ADD PRIMARY KEY (equip_type_id);

CREATE GENERATOR equip_type_id_gen;

SET TERM !! ;

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

END ! ! SET TERM ; !! CREATE TABLE WORKPLACE ( workplace_id t_workplace_id NOT NULL, class_id t_class_id NOT NULL, workplace_no t_workplace_no, workplace_name t_workplacename, ipaddress t_ip_address, note t note CREATE UNIQUE INDEX XPKWORKPLACE ON WORKPLACE ( workplace_id );

CREATE INDEX XIF1WORKPLACE ON WORKPLACE ( class_id );

ALTER TABLE WORKPLACE ADD PRIMARY KEY (workplace_id);

CREATE GENERATOR workplace_id_gen;

SET TERM !! ;

CREATE TRIGGER WORKPLACE_GEN_ID FOR WORKPLACE BEFORE INSERT AS BEGIN new.workplace_id = gen_id(workplace_id_gen, 1);

END ! ! SET TERM ; !! ALTER TABLE PART ADD FOREIGN KEY (equip_type_id) REFERENCES GROUPS;

ALTER TABLE PART ADD FOREIGN KEY (workplace_id) REFERENCES WORKPLACE;

ALTER TABLE WORKPLACE ADD FOREIGN KEY (class_id) REFERENCES CLASS;

SET TERM !! ;

CREATE PROCEDURE ins_class (classid INTEGER address VARCHAR(20) corpus_no VARCHAR(20) audit_no VARCHAR(20) telephone VARCHAR(20) note VARCHAR(20) } ) AS BEGIN INSERT INTO CLASS (address corpus_no audit_no telephonenote VALUES ( : address, : corpusno, : audit_no, : telephone, : note) ;

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE upd_class (class_id INTEGER, address VARCHAR(20), corpus_no VARCHAR(20), audit no VARCHAR(20), 65- telephone VARCHAR(20), note VARCHAR(20)) AS BEGIN UPDATE CLASS SET address=:address, corpus_no=:corpus_no, audit_no=:audit_no, telephone=:telephone, note=:note WHERE class_id=:class_id and address=:address and corpus_no=:corpus_no and audit_no=:audit_no and telephone=:telephone and note=:note};

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE del_class (ForEachAtt(CLASS,',') {}) AS BEGIN DELETE FROM CLASS WHERE class_id=:class_id;

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE ins_part (equip_id INTEGER, equip_type_id INTEGER, workplace_id INTEGER, inventory_no VARCHAR(20), techinfo VARCHAR(20), malfunct INTEGER, install_date DATE, note VARCHAR(20) } ) AS BEGIN INSERT INTO PART (equip_type_id, workplace_id, inventory_no, techinfo, malfunct, install_date, note) VALUES (:equip_type_id, :workplace_id, :inventory_no, :techinfo, :malfunct, :install_date, :note);

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE upd_part (equip_id INTEGER, equip_type_id INTEGER, workplace_id INTEGER, inventory-no VARCHAR(20), techinfo VARCHAR(20), malfunct INTEGER, install_date DATE, note VARCHAR(20)) AS BEGIN UPDATE PART SET equiptype_id=: equip_type_id, workplace_id=:workplace_id, inventory_no=:inventory_no, techinfo=:techinfo, malfunct=:malfunct, install_date=:install_date, note=:note WHERE equip_id=:equip_id and equiptype_id=: equip_type_id and workplace_id=:workplace_id and inventory_no=:inventory_no and techinfo=:techinfo and malfunct=:malfunct and install_date=:install_date and note=:note};

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE del_part (ForEachAtt(PART,',') {}) AS BEGIN DELETE FROM PART WHERE equip_id=:equip_id;

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE ins_groups (equip_type_id INTEGER, equip_name VARCHAR(20) } ) AS BEGIN INSERT INTO GROUPS (equip_name) VALUES (:equip_name);

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE upd_groups (equip_type_id INTEGER, equip_name VARCHAR(20;

AS - BEGIN UPDATE GROUPS SET equip_name=:equip_name WHERE equip_type_id=:equip_type_id and equipname=: equipname } ;

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE del_groups (ForEachAtt(GROUPS,',') {}) AS BEGIN DELETE FROM GROUPS WHERE equip type_id=:equip_type_id;

END ! ! SET TERM ; !! SET TERM !! ;

CREATE PROCEDURE ins_workplace (workplace_id INTEGER, class_id INTEGER, workplace_no VARCHAR(20), workplace_name VARCHAR(20), ip_address VARCHAR(20),. note VARCHAR(20) } ) AS BEGIN INSERT INTO WORKPLACE (class_id, workplace_no, workplace_name, ip_address, note) VALUES (:class_id, :workplace_no, :workplace_name, :ip_address, mote);

END ! ! SET TERM ; !! SET TERM !! ;

Pages:     | 1 |   ...   | 4 | 5 || 7 | 8 |   ...   | 14 |






















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

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