Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационное обеспечение систем управления. Построение запросов пр.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
3.76 Mб
Скачать

DELETE FROM PERSON

WHERE NOT PR_CODE IN

(SELECT EQ_PR_CODE FROM EQUIPAGE)

AND NOT PR_CODE IN

(SELECT TC_PR_CODE FROM TICKETI

Здесь используются два вложенных запроса. Первый возвраща­ ет коды личностей членов экипажа из таблицы EQUIPAGE, а вто­ рой - коды личностей из таблицы TICKET. В результате будут уда­ лены все строки из таблицы PERSON, коды личностей которых не попадают в результат вывода каждого из этих двух запросов.

11. ГЕНЕРАТОРЫ И ИХ ИСПОЛЬЗОВАНИЕ

При заполнении таблиц с суррогатным первичным ключом нам приходится вручную проставлять его значение, например 1, 2, 3, 10, 20, 30 и т.п. Это, в частности, не дает возможности доба­ вить в таблицу несколько строк одной командой INSERT, при по­ мощи конструкции SELECT, как это было показано в предшест­ вующем разделе.

Для решения этой проблемы большинство SQL-серверов имеет специальные механизмы для создания уникальных идентификато­ ров. В Interbase и Firebird для этого существует механизм генерато­ ров. Генераторы предназначены для получения последовательно­ стей уникальных чисел (1,2, 3 и т.д.). Например, в таблице аэропор­ тов для их нумерации введен столбец AP CODE, по которому построен первичный ключ. Столбец можно заполнять значениями генератора.

Нужно сразу заметить, что сами по себе генераторы не обеспе­ чивают сохранение последовательности номеров в случае удаления записей - генератор всего лишь выдает числа, по очереди увеличи­ вая их на некоторую величину и обеспечивая уникальность выдан­ ных значений, т.е. генератор выглядит как переменная типа Integer, которая находится в памяти и над которой можно выполнять опера­ ции Inc и Dec (прибавления и убавления).

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

Генератор - это специальный объект базы данных, который ге­ нерирует уникальные последовательные числа. Эти числа могут

В этот момент в базе создан новый генератор. Его значение] равно 0. Если вам нужно использовать другое начальное значение] то можно установить (изменить) значение генератора следующей

командой:

SET GENERATOR NEWID 1000

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

ров.

В общем, установка начального значения генератора о 0 зави­ сит только от специфических требований приложения.

Увеличение значения генератора

Выше уже было сказано, что функция GEN_ID действует ана­ логично функции Inc, т.е. увеличивает значение генератора на за­ данное число. Обычно используют инкремент значения равный I

GEN_ID(NEWID, 1)

Увеличение значения генератора функцией GEN_ID произвол дится в монопольном режиме. Эго означает, что одновременны? вызов GEN_ID(NEWID, I) двумя приложениями вернет каждом^ только свой идентификатор.

Получение значения генератора в приложение

Наиболее распространенным и правильным использование^ генераторов является «получение» нового идентификатора в кли ентское приложение и его последующее использование для тех или иных нужд. Это можно сделать вызовом

SELECT GEN_ID(NEWID, 1) FROM RDB$DATABASE RDB$DATABASE здесь используется как таблица, содержаща:

только одну запись. В результате этим запросом также будет выда на I запись со значением генератора, увеличенным на I. Если нуж но просто получить текущее значение генератора (без его прираще ния), используем вызов:

SELECT GENJD(NEWID, 0) FROM RDB$DATABASE

Триггеры

Триггер - это отдельная хранимая в базе подпрограмма, свя­ занная с таблицей, которая автоматически включается, когда в таб­ лицу вставляется (триггер добавления), модифицируется (триггер модификации) или удаляется (триггер удаления) строка. Триггер никогда не вызывается непосредственно. Он выполнятся всякий раз, когда приложение или пользователь пытаются вставлять, модифи­ цировать или удалять строку в таблице. Другими словами, триггер жестко связан с данными и выполняется тогда и только тогда, когда делается попытка изменить данные.

Триггеры создаются командой CREATE TRIGGER. Синтаксис этой команды следующий:

CREATE TRIGGER name FOR { table

[ACTIVE / INACTIVE;

{BEFORE/AFTER} {DELETE / IN SER T/U PD A ТЕ; [POSITION number;

AS < trigger_body>

< trigger_body> [< variable_declaration_list>} < block>

<variable_declaration_list> ::= DECLARE VARIABLE variable datatype;

[< variable_declarationJist>J

<Ыоск> =

BEGIN

<L_statement>

END

<L_statement>; ;=< compound_statement>/<L_statement>J

< compound_statement> = {< block> /statement;}

Синтаксические конструкции команды CREATE TRIGGER:

Команда

Описание

Name

Имя триггера. Имя должно быть уникальным

 

в базе данных

Команда

Описание

 

 

table

Имя таблицы, для которой создается триггер

ACTIVE | INACTIVE

Необязательная конструкция. Определяет актив­

 

ность триггера. ACTIVE -

триггер

включен,

BEFORE | AFTER

INACTIVE - триггер отключен

 

Обязательный. Определяет,

когда включается

 

триггер:

 

 

 

BEFORE - перед операцией,

выполняемой над

 

таблицей.

 

 

 

AFTER - после операции, выполняемой над таб­

 

лицей

 

 

DELETE | INSERT | UPDATE

Указывает, при выполнении какой именно опе­

 

рации с таблицей будет включаться триггер:

 

DELETE - удаление,

 

 

 

INSERT - вставка,

 

 

 

UPDATE - модификация

 

 

POSITION number

Задает порядок, в котором будут выполняться

 

триггеры (с одной таблицей и одними и теми же

 

условиями включения может быть связано не­

 

сколько триггеров), number должен быть целым

 

числом между 0 (по умолчанию)

и 32 767

 

включительно. Включение триггеров происходит

 

в порядке возрастания номеров (number). Нуме­

 

рация может и не быть последовательной. Если

 

триггеры имеют один и тот же номер, то они бу­

 

дут включаться в алфавитном порядке их имен

DECLARE VARIABLE

Объявляет локальные переменные,

используе­

variable datatype;

мые только в триггере. Объявление каждой пе­

 

ременной начинается с ключевых слов

 

DECLARE VARIABLE и заканчивается ;. Имена

 

объявляемых переменных должны быть уни­

 

кальными в триггере, datatype задает тип локаль­

 

ной переменной

 

 

<compound_statement>

Оператор SQL для хранимых процедур и тригге­

 

ров. Оператор завершается ;, если это не блок

 

BEGIN-END. После END ; не ставится

Для нашего случая необходимо еще перед созданием новой за­ писи найти значение, которое будет присвоено первичному ключу, для этого будет использоваться команда NEW.column, эта команда указывает на значение, которое предполагается присвоить полю базы данных.