Реализация серверной части базы данных

 

Серверную часть базы данных будем выполнять на сервере FireBird 2.1 в визуальной среде разработки IBExpert.

Запустим IBExpert. Выберем команду Database/Create Database (База данных/Создать базу данных). В появившемся окне Create Database (Создание базы данных) укажем:

· Server (Сервер) – Local (локальный)

· Database (Файл БД) – C:\01\LIBRARY.fdb

· UserName (Имя_пользователя) – SYSDBA

· Password (пароль) – masterkey – это имя и пароль администратора по умолчанию.

· Charset (кодировка) – WIN1251

· SQL Dialect (Диалект БД) – Dialect 3 (Диалект 3).

Нажмём OK. база данных будет создана. В появившемся окне Database Register (Регистрация БД) выберем в поле Версия сервера FireBird 2.1. Нажмем кнопку Register, и база данных будет зарегистрирована и отобразится в окне Database Explorer. В этом окне выберем зарегистрированную базу данных и выберем Database/Connect to Database (База данных/Подключиться к Базе данных). В окне Database Explorer отобразятся все элементы базы данных.

Создание таблиц

 

Создадим таблицу «Книги» (Books). Выберем Database/New Table (База данных/Новая таблица). В окне Table (Таблица) зададим имя Books и определим называния атрибутов их типы данных и ограничения. Откомпилируем скрипт, нажав <Ctrl+F9>.

Зададим ключевое поле таблицы «BOOKS». Для этого сделаем активной вкладку Constraint (Ограничения). Щелкнем правой кнопкой мыши в свободном пространстве окна Table (Таблица) и в выпадающем меню выберем пункт New primary key (новый первичный ключ). Далее установим первичный ключ для атрибута «ID_BOOKS». Для этого щелкнем левой кнопкой мыши в поле On Field (На поле) и установим нужный атрибут. Установим сортировку по возрастанию значения индекса – выберем Ascending для Index Sorting.

Перейдём на вкладку Fields (поля) щелчком правой кнопкой мыши на поле «ID_BOOKS» вызовем меню, из которого выберем Edit Field ID_BOOKS. В появившемся окне перейдём на вкладку Autoincrement (авто приращение). Ниже появятся три дополнительные вкладки Generator (генератор) Trigger (триггер) и Procedure (процедура). На вкладке Generator выберем Create Generator (создать генератор), присвоим ему имя «GEN_BOOKS_ID» и начальное значение укажем равным 1. Перейдём на вкладку Trigger и выберем Create Trigger (создать триггер). Автоматически будет написан код:

IF (NEW."ID_ BOOKS" IS NULL) THEN

NEW."ID_ BOOKS" = GEN_ID(GEN_BOOKS_ID,1);

Здесь содержится оператор условия. Если при обращении к новому значению столбца «ID_ BOOKS» (оператор NEW), оно является пустым (оператор IS NULL) то ему присваивается значение, генерируемое созданным ранее генератором GEN_BOOKS_ID (GEN_ID(имя_генератора, шаг) – оператор обращения к генератору). Нажмём «ОК» и откомпилируем скрипт.

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

Создадим две оставшиеся таблицы: «Издательства» (Publishers) и «Читатели» (Readers).

Создание триггеров

 

Создадим триггеры журнализации изменений таблицы «BOOKS». Для этого создадим таблицу «BOOKS_JOURNAL», в которую будут автоматически записываться любые изменения, добавления, удаления в таблице «BOOKS». При этом будет фиксироваться дата (поле «DATE»), операция (INS, UPD, DEL) над таблицей «BOOKS» (поле «OPERATION»), а также старое и новое значение столбцов этой таблицы. Для операции удаления новое значение столбцов будет пустым. Для операции добавления пустым будет старое значение столбцов.

Для журнализации была создана таблица:

CREATE TABLE BOOKS_JOURNAL (

OPERATION CHAR(6) NOT NULL,

ID_BOOKS_OLD INTEGER,

ID_BOOKS_NEW INTEGER,

ID_PUBLISHERS_OLD INTEGER,

ID_PUBLISHERS_NEW INTEGER,

K_PAGES_OLD INTEGER,

K_PAGES_NEW INTEGER,

COVER_OLD VARCHAR(15),

COVER_NEW VARCHAR(15),

TIRAZ_OLD INTEGER,

TIRAZ_NEW INTEGER,

ID_ABONENT_OLD INTEGER,

ID_ABONENT_NEW INTEGER,

DATE_ISSUE_OLD DATE,

DATE_ISSUE_NEW DATE,

NAME_OLD VARCHAR(20),

NAME_NEW VARCHAR(20),

DATE_ DATE NOT NULL,

TIME_ TIME NOT NULL,

ID_JOURNAL INTEGER NOT NULL);

ALTER TABLE BOOKS_JOURNAL ADD PRIMARY KEY (ID_JOURNAL);

Теперь создадим триггер, закреплённый за таблицей «BOOKS» для вставки, изменения и удаления записей. Для создания триггера выберем Triggers/New Trigger...(Триггер/Новый триггер). Появится окно создания триггера в котором укажем:

· Имя – «JOURNAL»;

· Для таблицы – «BOOKS»;

· Тип – «BEFORE», т. е. выполняется прежде операции;

· Укажем INSERT, UPDATE, DELETE.

Полный текст триггера будет следующий:

SET TERM ^;

CREATE OR ALTER TRIGGER JOURNAL FOR BOOKS

ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0

AS

begin

IF (INSERTING) THEN

begin

insert into BOOKS_JOURNAL values ('INSERT', null, new.id_books, null, new.id_publishers, null, new.k_pages, null, new.cover, null, new.tiraz, null, new.id_abonent, null, new.date_issue, null, new.name, 'now', 'now', gen_id(generator_journal,1));

end

IF (updating) THEN

begin

insert into BOOKS_JOURNAL values ('UPDATE', old.id_books, new.id_books, old.id_publishers, new.id_publishers, old.k_pages, new.k_pages, old.cover, new.cover, old.tiraz, new.tiraz, old.id_abonent, new.id_abonent, old.date_issue, new.date_issue, old.name, new.name, 'now', 'now', gen_id(generator_journal,1));

end

IF (deleting) THEN

begin

insert into BOOKS_JOURNAL values ('DELETE', old.id_books, null, old.id_publishers, null, old.k_pages, null, old.cover, null, old.tiraz, null, old.id_abonent, null, old.date_issue, null, old.name, null, 'now', 'now', gen_id(generator_journal,1));

end

end

^ SET TERM; ^

Триггер состоит из трёх условных операторов, проверяющих выполняется ли над записями таблицы соответственно операция вставки, изменения и удаления. Для операции вставки будет выполнен первый оператор, где в таблице журнала в поле «OPERATION» будет вставлено значение «INSERT», в поле «DATE_» текущая дата (значение «now»), в поле «TIME_» текущее время (значение «now»), также будут переписаны все новые значения полей, а в полях таблицы журнала, определённых для хранения старых значений полей таблицы «BOOKS», занесутся значения NULL. Второй оператор «IF (updating) THEN» проверяет, выполняется ли изменение данных, и если да, то выполнится оператор вставки записи в таблицу журнала «BOOKS_JOURNAL». Этот оператор задан аналогично предыдущему, только в поля под старые значения вместо NULL заносятся значения соответствующих столбцов таблицы «BOOKS» до их изменения. Аналогично задан последний оператор на удаления записи из таблицы «BOOKS», где NULL заносится в столбцы под новые значения.

Создадим триггеры каскадного обновления и удаления записей.

Создадим триггер каскадного обновления и удаления записей таблицы «BOOKS» при обновлении и удалении соответствующих им записей в таблице «PUBLISHERS».

Этот триггер закреплён за таблицей «PUBLISHERS», и задан как триггер для изменения и удаления записей. Для создания триггера выберем Triggers/New Trigger...(Триггер/Новый триггер). Появится окно создания триггера, в котором укажем:

· Имя – «PUBLISHERS_CASCADE_BOOKS»;

· Для таблицы – «PUBLISHERS»;

· Тип – «BEFORE», т. е. выполняется прежде операции;

· Укажем UPDATE, DELETE.

Полный текст триггера будет следующий:

SET TERM ^;

CREATE OR ALTER TRIGGER PUBLISHERS_CASCADE_BOOKS FOR PUBLISHERS

ACTIVE BEFORE UPDATE OR DELETE POSITION 0

AS

begin

IF (updating) THEN

begin

update books C

set C.id_publishers = new.id_publishers

where c.id_publishers = old.id_publishers;

end

else

begin

delete from books C

where c.id_publishers = old.id_publishers;

end

end

^

SET TERM; ^

Так как данный триггер выполняется при изменении и удалении записей из таблицы «PUBLISHERS», то в нём задано условие, проверяющее, какая операция над записями этой таблицы производится. IF (updating) THEN = ИСТИНА, если операция изменения (UPDATE), иначе =ЛОЖЬ (для данного триггера это операция удаления). В первом случае производится каскадное обновление записей при помощи оператора изменения данных UPDATE, во втором каскадное удаление при помощи операции DELETE FROM. В обоих случаях условием отбора записей на изменение или удаление является равенство значений поля «ID_PUBLISHERS» таблицы «BOOKS» и старым значением поля «ID_PUBLISHERS» таблицы «PUBLISHERS». В случае изменения данных этим полям присваиваются новые значения записей.

Аналогично создадим триггер каскадного обновления и удаления записей таблицы «BOOKS» при обновлении и удалении соответствующих им записей в таблице «READERS» – «READERS_CASCADE_BOOKS». Разница здесь в том, что триггер будет задан для таблицы «READERS» и в записях сравниваются значения полей «ID_ABONENT».




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: