Лабораторная работа № 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. Регистрация сервера осуществляется в диалоговом окне, которое открывается командой ServerRegister, в котором необходимо  указать имя администратора БД (User Name) - SYSDBA и его пароль (Password) – masterkey. При регистрации локального сервера в открывшемся окне должна быть включена радиокнопка Local Server. После нажатия на ОК в окне IBConsole появится вершина локального сервера. Снятие сервера с регистрации осуществляется командой ServerUn-Register.

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

После регистрации сервера необходимо зарегистрировать на нем БД с помощью окна, вызываемого командой  DatabaseRegister, в котором необходимо указать имя файла БД, алиас, определяющий псевдоним, под которым БД будет отображаться (не обязательно) и для того, чтобы сразу после регистрации соединиться с БД указать имя пользователя и пароль. Соединение с уже зарегистрированной БД может быть выполнено командой  DatabaseConnect.

Создание новой БД обеспечивается командой DatabaseCreate Database. После ее выполнения открывается диалоговое окно, в котором в панели File(s) надо записать имя файла создаваемой БД с полным путем доступа к нему. Interbase позволяет размещать БД в нескольких файлах, в этом случае в первой строке записывается имя первого файла, в следующих строках – имена остальных. В панели Options следует изменить только один параметр: Default Character Set (множество символов), установив его в  WIN1251.

После соединения с БД в левой части окна будут отображен список объектов БД: Domain, Table, Index, View, Stored procedure, External Function, Generator Exception.

Создание алиаса для серверной БД осуществляется с помощью приложения SQL Explorer командой ObjectNew при выборе драйвера 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] (<выражение>)

Определение столбца вычисляемых значений, где
 < выражение > - допустимое выражение SQL, которое возвращает единственное значение.

Домен

Имя существующего домена.

COLLATE collation(*)

Предложение COLLATE позволяет указать специфический порядок сортировки для типов данных CHAR, VARCAHR и BLOB-текст. Порядок сортировки на уровне столбца отменяет порядок сортировки определенный на уровне домена

DEFAULT(*)

Определяет значение по умолчанию столбца:

  • Литерал - вставляется специфическая строка, числовое значение или дата;
  • NULL - вводится значение NULL;
  • USER - вводится имя текущего пользователя.

Столбец должен быть совместимого текстового типа, для использования значения по умолчанию.

Установка значению по умолчанию на уровне столбца отменяет значение по умолчанию на уровне домена

Ограничение_столбца

Помещает именованное ограничение на таблицу или столбец. Ограничение - это правило применяемое к структуре или контексту таблицы. Если это предложение опущено, 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, ‘Комсомоленко’, ‘В-31’);

Каждое вводимое значение в предложении, должно совпадать с типом данных столбца, в который оно вставляется. Значение NULL, при вводе не заключается в одиночные кавычки.

Если имена столбцов в операторе не указываются, то значения вводятся в столбцы таблицы последовательно: первое значение, автоматически попадает в столбец 1, второе в столбец 2 и так далее.

Указание имен столбцов позволяет изменить порядок вставки значений в таблицу.

insert into Students (группа, фио) values (‘В-31’, ‘Репин’);

Использование оператора вставки с синтаксисом  insert into <имя_таблицы> <оператор Select> - позволяет выбирать данные из другой таблицы и вставлять их в данную. Эту возможность можно использовать для копирования всех данных одной таблицы в другую, причем эти таблицы могут быть созданными разными СУБД (попробуйте использовать эту возможность для переноса данных из таблиц формата Paradox во вновь созданные таблицы).

 

Редактирование данных осуществляется оператором:

Update <имя_таблицы> Set < <имя_поля>=<выражение>,<имя_поля>=<выражение>,…> Where <условие>

Наличие в операторе условия позволяет редактировать сразу множество записей, например при переименовании значения сразу во всей таблице. (А.с.644)

 

Удаление данных осуществляется оператором:

Delete from < имя_таблицы > Where <условие>

Наличие в операторе условия позволяет удалять сразу множество записей. Если не использовать секцию Where, то будут удалены все записи из таблицы.

 

Хранимые процедуры

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

Существует две разновидности хранимых процедур: процедуры выбора (аналог Select-запросов) и исполняемые процедуры. Процедуры выбора возвращают наборы данных, которые состоят из строк таблицы или ее отдельных значений. Исполняемые процедуры не возвращают данные, т. к. они предназначены для исполнения команд, например Delete. Инструкция EXECUTE PROCEDURE осуществляет вызов процедуры для выполнения.

Оператор CREATE PROCEDURE определяет новую сохраненную процедуру в базе данных.

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

Заголовок процедуры содержит:

  • Имя сохраненной процедуры, которое должно быть уникальным среди имен процедур и таблиц в базе данных.
  • Факультативный список входных параметров и их типов данных, которые процедура принимает из вызывающей программы.
  • Следующий за ключевым словом RETURNS список выходных параметров и их типов данных, если процедура возвращает значения в вызывающую программу.

Тело процедуры содержит:

  • Факультативный список локальных переменных и их типов данных.
  • Блок инструкций на языке процедур и триггеров InterBase, ограниченный BEGIN и END. Блок может включать в себе другие блоки, так, чтобы имелось несколько уровней вложения.

Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить другой символ для завершения инструкции 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 [var [,var ...]]
[RETUNING_VALUES
:var [, :var ...]]

Выполняет сохраненную исполняемую процедуру proc_name с входными параметрами, следующими за именем процедуры, возвращаемыми значениями в выходных параметрах и/или локальных переменных, перечисленных следом за RETURNING_VALUES. Запуск процедуры выбора осуществляется командой Select (Ч.с.211)

EXIT

Принудительное завершение работы процедуры.

FOR <тело оператора select >
DO <оператор>

Предназначен для получения множества значений. Для каждой записи, извлекаемой оператором Select, выполняется <оператор> , в качестве которого может быть использован оператор SUSPEND

IF (<условное_выражение>)
THEN <оператор1>
[ELSE <оператор2>]

Условный оператор

POST event_name

Отправляет сообщение event_name.

SUSPEND

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

WHILE (<условное_выражение >)
DO < оператор >

Оператор цикла с предусловием

WHEN
{<error> [, <error> ...] | ANY}
DO <
оператор>

<error> = {EXEPTION exeption_name
  | SQLCODE number
  | GDSCODE errcode }

Инструкция обработки ошибок. Когда одна из определенных ошибок происходит, выполняется <оператор>. Инструкция WHEN, если присутствует, должна находиться в конце блока, непосредственно перед END.

  • <error>- ошибка определенного вида;
  • ANY - обрабатываются все типы ошибок;
  • Number код ошибки SQL;
  • Errcode - код ошибки InterBase;

Инструкции в выделенных столбцах не могут использоваться при создании триггеров.

 

Синтаксис оператора для создания хранимой процедуры:

 

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);

и т.д.

Работа с индексами

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

Индексы, служат для сортировок и оптимизации доступа к данным. В конечном счете, ключи и индексы преобразуются в физические индексы – специальный механизм быстрого доступа к данным.

Необходимость создания индексов возникает в случаях когда:

  • часто производится поиск в БД;
  • столбец (столбцы)) часто перечисляется в предложении where оператора select;
  • часто строится объединение таблиц;
  • часто производится сортировка (order by в операторе select).

Не рекомендуется строить индексы по столбцам или группами столбцов, которые:

  • редко используются для поиска;
  • часто меняют значение (надо часто обновлять индекс);
  • содержит небольшое число вариантов значения.

Синтаксис оператора 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.

Вид модифицируем если:

  • Он является подмножеством одиночной таблицы или другого модифицируемого вида.
  • Все столбцы базовой таблицы, включенные в определение вида, допускают значения NULL.
  • Инструкция SELECT вида не содержит подзапросов, предикат DISTINCT, предложение HAVING, агрегатных функций, определенных пользователем функций или хранимых процедур.

Если определение вида не удовлетворяет этим условиям, он используется,  только для чтения.

Синтаксис

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 определения данных создать следующие объекты БД:

·    домены для тех типов данных и ограничений, которые повторяются при определении  нескольких полей (определяются на основании анализа типов полей всех таблиц БД).

·    таблицы (с обязательным определением первичных и внешних ключей, ссылочной целостности связанных таблиц, с вычисляемыми полями и ограничениями на ввод допустимых значений в отдельные поля);

·    генераторы для ключевых полей таблиц, имеющих автоинкрементный тип данных;

·    триггеры для работы генераторов;

·    просмотры:

·    индексы;

·    хранимые процедуры;

·    триггеры для реализации правил бизнес – логики.

  1. Познакомиться с синтаксисом операторов модификации объектов базы данных с помощью справочной системы интерактивного SQL.
  2. Получить навыки работы при работе с операторами SQL модификации объектов БД.
  3. Отработать в режиме интерактивного SQL операторы манипулирования данными.

При выполнении лабораторной работы в качестве примера для создания всех объектов БД использовать контрольный пример базы данных, входящий в поставку InterBase, хранящийся в  файле:

Program Files\Common Files\Borland Shared\Data\EMPLOYEE.GDB

 

Контрольные вопросы:

  1. Что представляет собой Borland InterBase Server?
  2. Как представлена БД в InterBase?
  3. Что такое системные таблицы и для чего они нужны?
  4. Как и с помощью какой программы производится регистрация пользователя сервера InterBase?
  5. Что такое алиас БД? Как он создается?
  6. Что такое язык SQL? Перечислите его составные части.
  7. Язык SQL оперирует терминами, несколько отличающимися от терминов реляционной теории. Приведите примеры обозначения основных терминов в обоих случаях.
  8. Что означает выражение: “Язык SQL является реляционно-полным”?
  9. Для чего используется язык определения данных? Перечислите его основные команды.
  10. Для чего используется язык управления данными? Перечислите его основные команды.
  11. Перечислите операторы манипулирования данными.
  12. Что такое ограничение целостности? Какие существуют типы ограничений целостности?
  13. Какое значение должны иметь столбцы, по которым строится первичный ключ?
  14. Что такое уникальный ключ?
  15. Что такое внешний ключ? Для чего он предназначен?
  16. Что такое генератор? Процесс создания, принцип действия и назначение.
  17. Перечислите операторы добавления, редактирования и удаления данных.
  18. Определение хранимой процедуры. Их разновидности, структура и назначение каждой.
  19. Что такое триггеры? Их типы, структура.
  20. Что такое домен? Ограничения на значения домена.
  21. Каким образом производится работа с индексами?
  22. Для чего используются виды (просмотры)?

Реклама от TUT.SU »