Лабораторная
работа № 5
Разработка баз данных средствами SQL-сервера Interbase. Команды языка SQL для описания данных.
Цель работы: Изучить команды описания
данных и команды манипулирования данными языка SQL. . Познакомиться с работой
приложения IBConsole.
Получить навыки работы при создании базы данных средствами SQL сервера - InterBase. Получить
навыки работы при работе с интерактивным SQL в приложениях IBConsole
и SQLExplorer.
Основные
теоретические сведения
Borland InterBase Server – система, обладающая широкими
возможностями построения больших корпоративных БД. Локальный сервер InterBase,
входящий в поставку Delphi
является усеченной локальной версией Borland Workgroup сервера, который находит
применение в больших реальных задачах. Borland InterBase Server
позволяет в локальном варианте разрабатывать программы, которые в дальнейшем могут
использоваться для работы на реальных системах. Приложение, отлаженное с
использованием Borland InterBase Server можно легко перенести на реальный
сервер InterBase,
а учтя некоторые особенности диалектов SQL, можно перенести и на другие имеющиеся
на рынке системы, такие как MS SQL Server,
Informix, Oracle и др.
Базой данных в
InterBase
является отдельный файл с расширением .gdb. В этом файле хранятся все
таблицы БД, просмотры, хранимые процедуры и все другие объекты.
InterBase хранит информацию о метаданных в специальных таблицах,
которые называются системными таблицами (system tables). Системные таблицы имеют специальные столбцы,
которые содержат информацию о типе метаданных в этой таблице. Имена всех
системных таблиц начинаются с "RDB$". Пример системной таблицы -
RDB$RELATIONS, которая содержит информацию о каждой таблице в базе данных.
Системные
таблицы имеют такую же структуру, как и определенные пользователем таблицы и
расположены в той же самой базе. Так как метаданные, пользовательские таблицы,
и данные все вместе расположены в одном и том же файле базы данных, каждая база
данных является законченным модулем и может быть легко перенесена между
различными машинами.
Программа IBConsole.
Регистрация пользователя сервера InterBase.
Создание и
использование БД в InterBase потребует от вас указания пользователя,
создавшего БД, и его пароля. Программа IBConsole позволяет произвести
такую регистрацию. Запуск программы может быть осуществлен из файла \Program Files\Borland\InterBase\bin\IBConsole.exe. Регистрация
сервера осуществляется в диалоговом окне, которое открывается командой Server – Register, в котором необходимо указать имя администратора БД (User Name) - SYSDBA и его
пароль (Password) – masterkey.
При регистрации локального сервера в открывшемся окне должна быть включена радиокнопка Local Server.
После нажатия на ОК в окне IBConsole появится вершина
локального сервера. Снятие сервера с регистрации осуществляется командой Server – Un-Register.
Процедура
регистрации выполняется один раз для каждого сервера, при последующих
выполнениях IBConsole серверы уже будут
зарегистрированы. Если при открытии программы IBConsole
ранее зарегистрированные серверы перечеркнуты красным крестиком, это означает,
что в настоящий момент отсутствует соединение с серверами, для его установки
надо выполнить команду Server
– Login.
После
регистрации сервера необходимо зарегистрировать на нем БД с помощью
окна, вызываемого командой Database – Register, в котором необходимо указать
имя файла БД, алиас, определяющий псевдоним, под
которым БД будет отображаться (не обязательно) и для того, чтобы сразу после
регистрации соединиться с БД указать имя пользователя и пароль. Соединение с
уже зарегистрированной БД может быть выполнено командой Database – Connect.
Создание
новой БД обеспечивается командой Database – Create Database.
После ее выполнения открывается диалоговое окно, в котором в панели File(s) надо записать имя файла создаваемой
БД с полным путем доступа к нему. Interbase позволяет размещать БД
в нескольких файлах, в этом случае в первой строке записывается имя первого
файла, в следующих строках – имена остальных. В панели Options следует изменить только один
параметр: Default Character Set
(множество символов), установив его в WIN1251.
После
соединения с БД в левой части окна будут отображен список объектов БД: Domain, Table, Index, View, Stored procedure, External Function,
Generator Exception.
Создание алиаса для серверной БД осуществляется с помощью
приложения SQL Explorer
командой Object – New при выборе драйвера INTRBASE. Для созданного
псевдонима в правой панели нужно изменить значения, заданные по умолчанию в
следующих строках:
LANGDRIVER = Pdox
ANSI Cirillic
SERVER NAME = [полное имя файла,
содержащего БД]
USER NAME = SYSDBA
Язык SQL
Язык SQL Структурированный
Язык Запросов предназначен для манипулирования данными в реляционных базах
данных, определения структуры баз данных и для управления правами доступа к
данным в многопользовательской среде. Поэтому, в язык SQL в качестве составных
частей входят:
·
язык манипулирования данными (Data Manipulation Language, DML)
·
язык управления данными (Data
Control Language, DCL).
Стандарт
SQL определяется ANSI (Американским Национальным Институтом Стандартов)
и в данное время также принимается ISO (Международной Организацией по
Стандартизации).
Нужно
заметить, что в настоящее время, ни одна система не реализует стандарт SQL в
полном объеме. Кроме того, во всех диалектах языка имеются возможности, не
являющиеся стандартными. Таким образом, можно сказать, что каждый диалект - это
надмножество некоторого подмножества стандарта SQL. Это затрудняет
переносимость приложений, разработанных для одних СУБД в другие
СУБД. Точное описание особенностей языка приводится в документации на СУБД,
которую Вы используете. SQL системы InterBase 6.Х
соответствует стандарту ANSI-92 и поддерживает диалект 1.
Язык SQL оперирует терминами, несколько отличающимися от терминов
реляционной теории, например, вместо "отношений" используются
"таблицы", вместо "кортежей" - "строки", вместо
"атрибутов" - "колонки" или "столбцы".
Язык
SQL является реляционно полным. Это означает, что любой оператор реляционной
алгебры может быть выражен подходящим оператором SQL.
Язык
определения данных используется для
создания и изменения структуры базы данных и ее составных частей - таблиц,
индексов, представлений (виртуальных таблиц), а также триггеров и хранимых
процедур. Основными его командами являются:
· CREATE DATABASE - создать базу данных
· CREATE DOMAIN - создать домен
· CREATE TABLE - создать таблицу
·
CREATE VIEW - создать просмотр
(виртуальную таблицу)
·
CREATE INDEX - создать
индекс
·
CREATE TRIGGER - создать
триггер
·
CREATE PROCEDURE - создать хранимую
процедуру
·
CREATE COLLATION - создать
последовательность
·
ALTER DATABASE - модифицировать базу
данных
·
ALTER DOMAIN - изменить
домен
·
ALTER TABLE - модифицировать таблицу
·
ALTER VIEW - модифицировать просмотр
·
ALTER INDEX - модифицировать индекс
·
ALTER TRIGGER - модифицировать триггер
·
ALTER PROCEDURE - модифицировать
хранимую процедуру
·
DROP DATABASE - удалить базу данных
·
DROP DOMAIN - удалить
домен
·
DROP TABLE - удалить таблицу
·
DROP VIEW - удалить виртуальную таблицу
·
DROP INDEX - удалить индекс
·
DROP TRIGGER - удалить триггер
·
DROP PROCEDURE - удалить хранимую
процедуру
·
DROP COLLATION - удалить
последовательность
Язык управления данными используется для управления правами доступа к данным и
выполнением процедур в многопользовательской среде. Более точно его можно
назвать "язык управления доступом". Он состоит из двух основных
команд:
·
GRANT - предоставить привилегии
пользователю или приложению на манипулирование объектами
·
REVOKE - отменить привилегии
пользователя или приложения (забрать права)
· SELECT
- отобрать строки из таблиц
· INSERT
- добавить строки в таблицу
· UPDATE
- изменить строки в таблице
· DELETE
- удалить строки в таблице
· COMMIT
- зафиксировать внесенные изменения
· ROLLBACK
- откатить внесенные изменения
Операторы языка SQL для определения данных
Таблицы
CREATE TABLE определяет
новую таблицу, ее столбцы и ограничения целостности в существующей базе данных.
Пользователь, который создает таблицу, становится владельцем таблицы и получает
полные привилегии для этого, включая возможность предоставления (GRANT)
привилегий другим пользователям, триггерам, и сохраненным процедурам.
CREATE TABLE
поддерживает несколько опций для определения столбцов:
CREATE TABLE имя_таблицы [EXTERNAL [FILE] ‘<имя_файла>’]
(<опр_столбца> [, < опр_столбца > | <ограничение> ...]);
<
опр_столбца > = имя_столбца {тип_данных | COMPUTED [BY] (<выражение>) | домен}
[DEFAULT {литерал | NULL | USER}]
[NOT NULL] [<огранич_столбца >]
[COLLATE collation]
В табл. 1 приводится описание аргументов,
используемых синтаксисом оператора CREATE. Типы данных, используемые InterBase приведены в
табл.2.
Таблица
1. Описание аргументов команды Create Table.
|
Аргумент |
Описание |
|
EXTERNAL [FILE] "<имя_файла>" |
Объявляет что данные для
создаваемой таблицы, постоянно располагаются во внешней к базе данных таблице
или файле. |
|
COMPUTED [BY] (<выражение>) |
Определение столбца вычисляемых
значений, где |
|
Домен |
Имя существующего домена. |
|
COLLATE collation(*) |
Предложение COLLATE позволяет
указать специфический порядок сортировки для типов данных CHAR, VARCAHR и
BLOB-текст. Порядок сортировки на уровне столбца отменяет порядок сортировки
определенный на уровне домена |
|
DEFAULT(*) |
Определяет значение по
умолчанию столбца:
Столбец должен быть
совместимого текстового типа, для использования значения по умолчанию. Установка значению по умолчанию
на уровне столбца отменяет значение по умолчанию на уровне домена |
|
Ограничение_столбца |
Помещает
именованное ограничение на таблицу или столбец. Ограничение - это правило применяемое
к структуре или контексту таблицы. Если это предложение опущено, InterBase создает системное
имя для ограничения. {{PRIMARY KEY | UNIQUE} (имя_столбца[,имя_столбца
...]) |
FOREIGN KEY
(имя_столбца [,имя_столбца ...]) REFERENCES other_table | CHECK (<ограничение_значения>)} |
(*) –
использование данных атрибутов в CREATE TABLE отменяет значения соответствующих
атрибутов, определенные на уровне домена.
Таблица 2.
Обзор типов данных InterBase
|
Тип
данных столбца |
Размер, байт |
Описание |
|
Smallint |
2 |
Целочисленные значения от – 32768 до + 32767 |
|
Integer (INT) |
4 |
Целочисленные значения от – 2 147 483
648 до + 2 147 483 647 |
|
Float |
4 |
Вещественные
числа до 7 значащих цифр в диапазоне от 3.4* 10-38 до 3.4 *10+38 |
|
Double precision
|
8 |
Вещественные
числа до 15 значащих цифр в диапазоне от 1.7* 10-308 до 1.7 *10+308 |
|
Numeric или Decimal (NUM, DEC) |
Переменный |
Вещественные числа с фиксированной запятой. При определении
этого типа дополнительно указывается общее количество значащих цифр числа и количество цифр в дробной части, например Numeric(12,2) |
|
Char (n) или Character (n) |
0..32768 |
Текстовый столбец длиной до n
символов |
|
Varchar (n)
|
0..32768 |
Текстовый столбец переменной длины, содержащий
до n символов |
|
Date |
8 |
Дата в пределах от 01.01.0100 до 11.12.5941 |
|
Blob |
Переменный |
Любой тип двоичных данных, например файл BMP |
Ограничения
целостности определяются для таблицы при ее создании и могут быть двух уровней:
на уровне столбца или на уровне всей таблицы. Наложение ограничения целостности
на отдельный столбец следует за его именем и типом.
Ограничения целостности это правила, которые
контролируют базу данных и проверяют корректность вводимых данных. Они
охватывают все транзакции к базе данных и автоматически поддерживаются
системой. CREATE TABLE может создавать следующие типы ограничений целостности:
Синтаксис:
CHECK <ограничение>, где
<ограничение>=
{<значение> <знак_операции> {< значение1
> | (<выбор_одного>)}
| <
значение > [NOT] BETWEEN < значение1 > AND < значение2 >
| <
значение > [NOT] LIKE < маска_подобия > [ESCAPE < символ >]
| <
значение > [NOT] IN (<значение1 > [, < значение 2> ...] |
<выбор_многих>)
| < значение > IS [NOT] NULL
| < значение > {[NOT] {= | < | >} | >= |
<=}
{ALL | SOME | ANY} (<выбор_многих >)
| EXISTS
(<выражение_выбора>)
| SINGULAR
(<выражение_выбора >)
| < значение > [NOT] CONTAINING < значение1 >
| < значение > [NOT] STARTING [WITH] < строка >
| NOT <ограничение>
| <
ограничение > OR <
ограничение >
| < ограничение > AND < ограничение >}
< значение > = {имя_столбца | <константа>
| <выражение> | <функция>
|
NULL | USER | RDB$DB_KEY
} [COLLATE collation]
<константа> = число
| "строка"
<функция> = {
COUNT
(* | [ALL] < значение >
| DISTINCT < значение >)
| SUM
([ALL] < значение > | DISTINCT < значение >)
| AVG
([ALL] < значение > | DISTINCT < значение >)
| MAX
([ALL] < значение > | DISTINCT < значение >)
| MIN
([ALL] < значение > | DISTINCT < значение >)
| CAST
(<значение > AS <тип_данных>)
|
UPPER (<значение >)
| GEN_ID (генератор,
< значение >)
}
< знак_операции > - {= | < | > |
<= | >= | !< | !> | <> | !=}
< выбор_одного
> - SELECT (выбор) на одном столбце, который возвращает точно одно
значение или не возвращает ничего.
<выбор_многих>
- SELECT на одном столбце, который возвращает ноль или более значений.
<выражение_выбора>
- SELECT на списке значений, который возвращает ноль или более значений.
<маска_подобия>
- произвольная строка, возможно, содержащая символы – заменители % и/или _ .
Первичный ключ
С помощью
спецификатора PRIMARY KEY
можно указать столбец (или столбцы), по которым в таблице будет построен
первичный ключ. Если в первичный ключ входит единственный столбец, спецификатор
ставится при определении столбца (определение ограничения целостности на уровне
столбца), если в состав первичного ключа входит несколько столбцов,
спецификатор ставится после определения всех полей таблицы (определение
ограничения целостности на уровне таблицы).
Столбцы, по которым
строится первичный ключ, должны иметь значение not
null.
Первичный
ключ служит для установления связи с внешним ключом (foreign
key) дочерней таблицы и определяет ссылочную
целостность между родительской и дочерней таблицами.
Уникальный
ключ
Строится по столбцу
(столбцам) когда столбец не входит в первичный ключ и имеет уникальное значение.
Create table klient (
Imja_klienta varchar (20)
not null primary key,
Nom_scheta varchar (50)
not null,
Unique (nom_scheta)); (при определении ключевых полей на
уровне столбцов)
Или nom_scheta varchar (50)
not null unique (при определени
ключевых полей на уровне таблицы)
Внешний
ключ
Создается для
обеспечения ссылочной целостности в дочерней таблице с помощью спецификатора Foreign key ,
формат которого:
Foreign key (<список _столбцов_ внешнего_ ключа_ дочерней_
таблицы>)
references <имя_род_табл>
[<cписок_ст_род_табл>]
[on delete {no action | cascade |
set default | set null}]
[on update {no action | cascade |
set default | set null}]
имя_род_табл – таблица, в которой описан первичный ключ (или
столбец с атрибутом unique);
список_ст_род_табл – не обязателен при ссылке на первичный
ключ родительской таблицы, в других случаях необходим.
On
delete, on update – указывают действия сервера для изменения
записей дочерней таблицы при удалении или изменении первичного ключа в
родительской таблице:
No action – блокировать удаление
(изменение), если в дочерней таблице есть хотя бы одна запись, ссылающаяся на
удаляемое (изменяемое) значение;
Cascade – произвести
каскадные изменения в дочерней таблице: удалить записи, ссылающиеся на
удаленное значение первичного ключа или изменить значение внешнего ключа в
соответствии с новым значением первичного ключа;
Set
default – установить значение внешнего ключа,
заданное по умолчанию;
Set
null –установить значение внешнего ключа в null.
Пример:
определим две таблицы. Родительская detal с
полями name_det (имя детали) и zena_ed (цена за единицу), первичный
ключ по полю name_det.
Дочерняя prihod (приход со склада) с полями n_prihod (номер прихода), date_prihod (дата прихода), name_det (имя детали), kolvo (количество деталей в приходе).
Первичный ключ по n_prihod, внешний – name_det.
Create table detal (
Name_det varchar (20)
not null,
Zena_ed integer not null,
primary key (name_det));
Create table prihod (
N_prihod integer not null primary key,
Date_prihod date not null,
Name_det varchar (20)
not null,
Kolvo integer not null
Foreign key (name_det)
references detal).
Именование
ссылочной целостности
Ссылочная целостность может именоваться следующим
образом:
[constraint <имя
ссылочной целостности>]
foreign key (<список столбцов внешнего ключа>)
references <имя
родительской таблицы>
[<список столбцов родительской таблицы>]
Для конкретного примера в таблицу prihod добавим:
Kolvo integer not null,
Constraint po_detaly
foreign key (name_det)
references detal;
Именование ссылочной
целостности никак не влияет на работу сервера, однако ее при необходимости
можно удалить без переопределения всей таблицы.
Создание генераторов
В таблицах InterBase нет автоинкрементного типа данных, который
удобно было бы использовать при построении первичных ключей, чтобы однозначно
определять любую запись в таблице. Для помещения в такие столбцы уникальных
значений, в InterBase предусмотрен специальный механизм
генераторов. Для каждого автоинкрементного столбца БД создается свой генератор.
Генератор – это хранящаяся в БД программа, выдающая при каждом обращении к ней
уникальное число, последовательность создания которого следующая:
1) создание
генератора оператором:
Create Generator Имя_генератора
2) установка
начального значения генератора оператором:
Set Generator Имя_генератора To Нач_значение
3) создание
триггера, устанавливающего в автоинкрементное поле значение, полученное от
генератора:
Create
Trigger Имя_триггера For Имя_таблицы
Active Before Insert {активизация триггера перед вставкой новой записи}
As
Begin
New.Имя_автоинкр_поля = Gen_ID(Имя_генератора,
1);
End
Где
New – указывается при обращении из триггера к
новому значению поля;
Gen_ID – встроенная функция, возвращающая текущее
значение генератора, увеличенное на 1.
Операции
изменения записей в таблицах
Добавление данных
Осуществляется с использованием оператора вставки
INSERT. В самой простой форме, INSERT использует следующий синтаксис:
insert into <имя_таблицы>[<имя_столбца>,<имя_столбца>
, …] values ( <значение>, < значение >, . . .);
insert into Students values (11, ‘Комсомоленко’, ‘В-
Каждое вводимое значение в предложении, должно
совпадать с типом данных столбца, в который оно вставляется. Значение NULL, при
вводе не заключается в одиночные кавычки.
Если имена столбцов в операторе не указываются, то значения
вводятся в столбцы таблицы последовательно: первое значение, автоматически
попадает в столбец 1, второе в столбец 2 и так далее.
Указание имен столбцов позволяет изменить порядок
вставки значений в таблицу.
insert into Students
(группа, фио) values (‘В-
Использование
оператора вставки с синтаксисом insert into <имя_таблицы>
<оператор Select>
- позволяет выбирать данные из другой таблицы и вставлять их в данную. Эту возможность можно использовать для копирования
всех данных одной таблицы в другую, причем эти таблицы могут быть созданными
разными СУБД (попробуйте использовать эту возможность для переноса данных из
таблиц формата Paradox
во вновь созданные таблицы).
Редактирование
данных осуществляется оператором:
Update <имя_таблицы>
Set < <имя_поля>=<выражение>,<имя_поля>=<выражение>,…>
Where <условие>
Наличие в операторе условия позволяет редактировать
сразу множество записей, например при переименовании значения сразу во всей
таблице. (А.с.644)
Удаление
данных осуществляется оператором:
Delete from
< имя_таблицы > Where <условие>
Наличие в операторе условия позволяет удалять сразу
множество записей. Если не использовать секцию Where, то будут удалены все записи из
таблицы.
Хранимые
процедуры
Хранимая
процедура – это отдельная программа, написанная на языке процедур и
триггеров используемого сервера баз
данных, и сохраненная как часть метаданных базы данных.
Существует
две разновидности хранимых процедур: процедуры выбора (аналог Select-запросов) и исполняемые процедуры. Процедуры
выбора возвращают наборы данных, которые состоят из строк таблицы или ее
отдельных значений. Исполняемые процедуры не возвращают данные, т. к.
они предназначены для исполнения команд, например Delete. Инструкция EXECUTE PROCEDURE осуществляет вызов
процедуры для выполнения.
Оператор CREATE
PROCEDURE определяет новую сохраненную процедуру в базе данных.
Сохраненные процедуры
состоят из заголовка и тела.
Заголовок
процедуры содержит:
Тело процедуры
содержит:
Важно:
Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой
с запятой, вы должны определить другой символ для завершения инструкции CREATE
PROCEDURE в ISQL. Используйте SET TERM ^ перед CREATE PROCEDURE
чтобы определить терминатор отличный от точки с запятой. После инструкции
CREATE PROCEDURE, включите SET TERM ^, что бы изменить терминатор обратно к
точке с запятой.
InterBase не позволяет удалять
объекты базы данных, которые воздействуют на поведение существующих процедур.
Язык процедур
и триггеров InterBase это
полный язык программирования для сохраненных процедур и триггеров. Он включает:
|
Инструкция |
Описание |
|
BEGIN ... END |
Операторные скобки. Операторы,
заключенные между ними должны отделяться друг от друга символом - ; (в том числе и перед словом END). Допускается произвольная глубина
вложенности. |
|
переменная = выражение |
Оператор присваивания. |
|
/* comment_text
*/ |
Комментарий к программе |
|
EXCEPTION exception_name
|
Возбуждение именованной
исключительной ситуации. Исключительная ситуация - определенная пользователем
ошибка, которая может быть обработана инструкцией WHEH - DO. |
|
EXECUTE PROCEDURE |
Выполняет сохраненную исполняемую
процедуру proc_name с входными параметрами,
следующими за именем процедуры, возвращаемыми значениями в выходных параметрах
и/или локальных переменных, перечисленных следом за RETURNING_VALUES. Запуск
процедуры выбора осуществляется командой Select (Ч.с.211) |
|
EXIT |
Принудительное завершение
работы процедуры. |
|
FOR <тело
оператора select > |
Предназначен
для получения множества значений. Для каждой записи, извлекаемой оператором Select, выполняется <оператор> , в качестве которого может быть использован оператор SUSPEND |
|
IF (<условное_выражение>) |
Условный оператор |
|
POST event_name |
Отправляет сообщение event_name. |
|
SUSPEND |
Приостанавливает работу
процедуры до тех пор, пока вызывающая программа не потребует очередной порции
данных, используется только в процедурах выбора. |
|
WHILE (<условное_выражение
>) |
Оператор цикла с предусловием |
|
WHEN |
Инструкция обработки ошибок.
Когда одна из определенных ошибок происходит, выполняется <оператор>.
Инструкция WHEN, если присутствует, должна находиться в конце блока,
непосредственно перед END.
|
Инструкции в выделенных столбцах не могут
использоваться при создании триггеров.
Синтаксис оператора для создания хранимой
процедуры:
CREATE PROCEDURE ИмяПроцедуры
[(входной_параметр тип_ данных[,входной_параметр тип_ данных ...])]
[RETURNS выходной_параметр тип_ данных [, выходной_параметр
тип_ данных ...])]
AS
DECLARE VARIABLE локальная_переменная тип_данных;
[DECLARE VARIABLE локальная_переменная тип_данных; ...]
BEGIN
<оператор>;
[<оператор >; ...]
END
Входные
параметры служат для передачи в процедуру значений из вызывающего приложения,
выходные – для возвращения результирующих значений. Локальные переменные служат
для временного хранения промежуточных результатов вычислений.
Если
локальные переменные, входные или выходные параметры указываются в теле SQL-оператора, их именам
должны предшествовать двоеточия.
Триггеры
Триггер – эта
процедура, ассоциированная с таблицей, автоматически исполняемая SQL – сервером при наступлении одного из
событий: обновление, удаление или добавление новой записи таблицы. По отношению
к инициализирующему их событию различают два типа триггеров: выполняемые до или
после наступления события и автоматически обеспечивающие каскадные воздействия
в дочерних таблицах при изменении или удалении записи в родительской таблице.
Нельзя вызывать триггер непосредственно из программы, передавать ему параметры
и возвращать их значения. Триггеры всегда реализуют действие.
Следующая
таблица отражает расширения языка для триггеров:
|
Инструкция |
Описание |
|
NEW.column |
Позволяет обратиться к значению столбца, имевшему место
после внесения изменений. |
|
OLD.column |
Позволяет обратиться к значению столбца, имевшему место до
внесения изменений. |
|
POST_EVENT event_name |
Отправляет сообщение event_name. |
Синтаксис
CREATE TRIGGER имя_ триггера FOR имя_ таблицы
[ACTIVE | INACTIVE]
{BEFORE | AFTER}
{DELETE | INSERT | UPDATE}
[POSITION номер]
AS
DECLARE VARIABLE локальная_переменная тип_ данных;
[DECLARE VARIABLE локальная_переменная тип_ данных; ...]
BEGIN
<оператор>;
[<оператор>; ...]
END
Таблица 4. Описание аргументов оператора
создания триггеров
|
Аргумент |
Описание |
|
ACTIVE INACTIVE |
Указывает будет ли триггер активен |
|
BEFORE AFTER |
Определяет, будет ли триггер срабатывать
до или после изменения данных. |
|
DELETE | INSERT | UPDATE |
Определяет операцию для изменения данных. |
|
POSITION номер |
Определяет очередность
срабатывания триггера, если для одной и той же таблицы создано несколько
однотипных триггеров |
Домены
Если в таблице присутствуют столбцы с одинаковыми
характеристиками, то можно предварительно описать их тип и поведение с помощью
домена.
Синтаксис
CREATE DOMAIN domain [AS] <datatype> [DEFAULT {literal | NULL | USER}] [NOT NULL] [CHECK (<dom_search_condition>)] [COLLATE collation];
Например,
создать тип Pol_type для таблицы Sotr.
Create domain Pol_type
as char (3) collate
PXW_CYRL;
Create table Sotr
(
Fio char (20) not null,
Pol Pol_type,
otdel char (10),
dolj char (20),
primary key (Fio)
);
где Not null – столбцы ассоциированные с доменом обязательно должны
содержать значение.
Ограничения
на значения домена
Записываются
в определении столбца и начинаются со слова check.
<огр_домена>={
value <оператор> <значение>
| value
[not] between <значение 1> and <значение 2>
| value
[not] like <значение> [escape <значение>]
| value [not] in ( <значение
1> [, <значение 2>…] )
| value
is [not] null
| value
[not] containing <значение>
| not <огр_домена>
|
<огр_домена> or
<огр_домена>
|
<огр_домена> and
<огр_домена>
}
где:
<оператор> = {= |<|>|<=|=>|!<|>!|<>|!=}
!<
– не меньше, !> – не больше, != – не равно.
Value означает, что элементы считаются
правильными.
Create domain ID_Type as integer check (value >=100); id_Type >= 100.
Between <значение 1> and <значение 2> – значение домена в
интервале от значения 1 до значения 2, включая их.
Like <значение 1> [<значение 2>]
– значение домена должно "походить" на значение 1.
Like "%USD" – вводимое
значение должно оканчиваться на USD, все предыдущие значения не имеют.
Like "__04" ("_"–
единичный символ) вводится значение четырьмя символами, два последних – 04.
Если
"%" и "_" нужны как символы в Like,
то указываются значения в Escape и
заменяются другими символами.
Например,
Summa должна заканчиваться %.
Create domain summa as char (10) check (like "%!%" escape "!");
После
символа ! служебные символы (%) теряют свою силу и
становятся обычными символами.
In (<значение 1>[,<значение 2>…])
– значение домена должно совпадать с одним из приведенных
параметров списка.
Create domain Pol_type as
char (3) check (value in ("муж","жен"));
Containing <значение> – значение домена
должно иметь вхождения параметра <значение> в любом месте.
Например,
в наименовании отдела вхождения 041 где угодно "отдел – 041002" или
"00304192" и т. д.
Create domain otdel_type as
varchar (10) check
(value containing "041" collate PXW_CYRL;
Starting [with]
<значение> – значение домена должно начинаться с
<значение>, например "041".
Большинство
условий могут комбинироваться AND или OR или указывать NOT.
Check (value not between 1 and 100);
и
т.д.
Работа
с индексами
Первичный и внешний ключи строятся для обеспечения
ссылочной целостности реляционно -связанных
таблиц. Кроме этого, первичный ключ, выполняет функции уникальности своих
значений. Для этих же целей используется и просто уникальный ключ.
Индексы, служат для сортировок и оптимизации доступа
к данным. В конечном счете, ключи и индексы преобразуются в физические
индексы – специальный механизм быстрого доступа к данным.
Необходимость создания индексов возникает в
случаях когда:
Не
рекомендуется строить индексы по столбцам или группами столбцов, которые:
Синтаксис
оператора create index
Оператор
Create [unique] [asс| desс] Index
<имя индекса> on <имя
таблицы> (столбец 1,…);
Unique – уникальный индекс, не допускает
одинаковых значений
Asс– сортировка полей
индекса по возрастанию (по умолчанию)
desс– сортировка полей
индекса по убыванию.
После многократного внесения изменений в таблицу
индексы могут быть разбалансированы, "глубина" индекса возрастает.
Это приводит к увеличению времени поиска. Необходимо время от времени:
·
выполнять пересоздание и балансировку индекса
оператором alter index
<имя индекса> deactivate; (alter index <имя
индекса> activate);
·
переписывать выбираемость
индекса оператором set statistics;
·
уничтожать и вновь создавать индекс операторами drop index <имя
индекса>;и create
index.
Нельзя
перестроить индекс, находящийся в
запросах; перестроить индекс, построенный по первичному, внешнему ключу.
Просмотры
(Виды)
CREATE VIEW
описывает вид данных, основанный на одной или более основной таблицы в базе
данных. Возвращаемые строки определены инструкцией SELECT, в которой перечисляются
столбцы исходных таблиц. В базе данных существует только определение вида; вид непосредственно
не представляет собой сохраненные данные. Над видами допустимо выполнение
операций выбора, project, join
и union, как и над таблицами.
Пользователь,
который создает вид - его владелец, и имеет все привилегии для этого, включая
возможность предоставлять (GRANT) привилегии другим пользователям, триггерам и
сохраненным процедурам.
Обратите внимание: Любые столбцы,
используемые в значении выражения, должны присутствовать раньше, чем выражение
может быть определено.
Предложение
инструкции SELECT не должно включать предложение ORDER BY.
Вид
модифицируем если:
Если
определение вида не удовлетворяет этим условиям, он используется, только для чтения.
Синтаксис
CREATE VIEW имя_вида [(имя_столбца_вида
[,имя_столбца_вида
...])]
AS <select> [WITH
CHECK OPTION];
|
Аргумент |
Описание |
|
имя_вида |
Имя для вида. |
|
имя_столбца_вида |
Обязателен, если вид содержит столбцы, основанные на
выражении. По умолчанию, имена столбцов берутся из базовой таблицы. |
|
<select> |
Определяет критерии выбора строк, для включения в вид. |
|
WITH CHECK OPTION |
Предотвращает операции INSERT или UPDATE на модифицируемом
виде, если INSERT или UPDATE нарушает условия поиска определенные в
предложении WHERE в <select>. |
Изменение
определения данных
Оператор alter
table позволяет:
. добавить определение нового
столбца;
. удалить столбец из таблицы;
. удалить атрибуты целостности
таблицы или отдельного столбца;
. добавить новые атрибуты
целостности.
Эта команда
не является частью стандарта ANSI; но это – широко доступная, и довольно
содержательная форма, хотя ее возможности несколько ограничены. Она
используется, чтобы изменить определение существующей таблицы. Обычно, она
добавляет столбцы к таблице. Иногда она может удалять столбцы или изменять их
размеры.
Добавление
нового столбца в таблицу БД:
Alter table <имя
таблицы> add <имя столбца1> [, <имя столбца 2>…];
Столбец
будет добавлен со значением NULL для всех строк таблицы. Новый столбец станет
последним по порядку столбцом таблицы.
Добавление
новых ограничений целостности:
Alter table <имя
таблицы> add [constraint
<имя ограничения>] <определение целостности>;
Удаление
столбца (столбцов) из таблицы:
Alter table <имя
таблицы> drop <имя столбца1> [, <имя столбца 2>…];
Удаление
ограничений целостности (уровень таблицы):
Alter table <имя
таблицы> drop <ограничения
целостности>;
Удаление
таблицы целиком:
Drop table <имя
таблицы>;
Удаление
таблицы может быть блокировано для родительских таблиц, если есть дочерние.
Пусть имеем таблицу:
Create table sotr
(
Id_sotr integer not null primary key,
Fio char (10),
Otdel varchar (10),
Doljnost char (10));
Пусть
необходимо изменить характеристики столбца
fio c char (10) на varchar(25):
1
добавим в таблицу новый временный столбец fio_tmp:
alter table sotr
add fio_tmp char (10);
2
копируем данные из fio в fio_tmp:
update sotr
set fio_tmp = fio;
3
удаляем столбец fio:
alter table sotr
drop fio;
4 создаем новый стобец fio:
alter table sotr
add fio varchar (25);
5 переписываем данные:
update sotr
set fio = fio_tmp;
6
удаляем временный столбец:
alter table sotr
drop fio_tmp.
Задание к
лабораторной работе:
1.
Выполнить анализ схемы данных разработанной ранее БД для
исключения возможности возникновения
аномалий модификации данных.
2.
С целью доказательства нахождения разработанной схемы в
3НФ (или НФБК), для каждого отношения (таблицы) определить функциональные
зависимости. При выявлении аномалий модели данных выполнить ее нормализацию, следуя алгоритму
нормализации.
3.
Создать БД на сервере InterBase и
зарегистрировать ее с использованием приложения IBConsole.
4.
Создать алиас БД сервера InterBase
с использованием приложения SQLExplorer.
5.
Познакомиться с возможностями приложений IBConsole
и SQLExplorer
при создании и выполнении команд SQL в интерактивном режиме.
6.
С использованием команд SQL определения данных создать следующие
объекты БД:
· домены
для тех типов данных и ограничений, которые
повторяются при определении нескольких
полей (определяются на основании анализа типов полей всех таблиц БД).
· таблицы
(с обязательным определением первичных и внешних ключей, ссылочной целостности
связанных таблиц, с вычисляемыми полями и ограничениями на ввод допустимых
значений в отдельные поля);
· генераторы
для ключевых полей таблиц, имеющих автоинкрементный тип данных;
· триггеры
для работы генераторов;
· просмотры:
· индексы;
· хранимые
процедуры;
· триггеры
для реализации правил бизнес – логики.
При выполнении лабораторной работы в качестве примера для создания всех объектов БД использовать контрольный пример базы данных, входящий в поставку InterBase, хранящийся в файле:
Program Files\Common
Files\Borland Shared\Data\EMPLOYEE.GDB
Контрольные вопросы: