Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

GEN_ID (NEWID, 1)

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

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

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

 

SELECT GEN_ID (NEWID, 1) FROM RDB$DATABASE

RDB$DATABASE здесь используется как таблица, содержащая только одну запись. В результате этим запросом также будет выдана 1 запись со значением генератора, увеличенным на 1.

Триггер

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

Триггеры создаются командой CREATE TRIGGER.

Синтаксис этой команды следующий:

CREATE TRIGGER name FOR { table

[ACTIVE / INACTIVE;

{BEFORE / AFTER} {DELETE / INSERT / UPDATE;

[POSITION number;

AS < trigger_body>

< trigger_body>::= [< variable_declaration_list>} < block>

< variable_declaration_list>::= DECLARE VARIABLE variable datatype;

[< variable_declaration_list>J

< Ыоск>:: =

BEGIN

<L_statement>

END

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

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

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

Команда Описание
Name Имя триггера. Имя должно быть уникальным в базе данных
table Имя таблицы, для которой создается триггер
ACTIVE | INACTIVE Необязательная конструкция. Определяет активность триггера. ACTIVE - триггер включен, INACTIVE - триггер отключен
BEFORE | AFTER   Обязательный. Определяет, когда включается триггер: BEFORE - перед операцией, выполняемой над таблицей. AFTER - после операции, выполняемой над таблицей
DELETE | INSERT | UPDATE Указывает, при выполнении какой именно операции с таблицей будет включаться триггер: DELETE - удаление, INSERT -вставка, UPDATE- модификация
POSITION number POSITION number задает порядок, в котором будут выполняться триггеры (с одной таблицей и одними и теми же условиями включения может быть связано несколько триггеров), number должен быть целым числом между 0 (по умолчанию) и 32767 включительно. Включение триггеров происходит в порядке возрастания номеров (number). Нумерация может и не быть последовательной. Если триггеры имеют один и тот же номер, то они будут включаться в алфавитном порядке их имен
DECLARE VARIABLE variable datatype; Объявляет локальные переменные, используемые только в триггере. Объявление каждой переменной начинается с ключевых слов DECLARE VARIABLE и заканчивается ";". Имена объявляемых переменных должны быть уникальными в триггере, datatype задает тип локальной переменной
<compound_statement> Оператор SQL для хранимых процедур и триггеров. Оператор завершается ";", если это не блок BEGIN-END. После END ";" не ставится  

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

Чтобы во время создания новой записи, она создавалась с уже готовым первичным ключом воспользуемся триггером «перед вставкой», команда создания триггера должна содержать конструкцию ACTIVE BEFORE INSERT.

Разработчики чаще всего пытаются использовать генератор в триггере, примерно следующим способом (показываем на примере генератора подставляющего значение первичного ключа в таблицу AIRPOR, имя триггера будет AIRPORT_BI, это должно означать, что триггер срабатывает перед вставкой записи – BEFORE INSERT):

CREATE TRIGGER FOR AIRPORT

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

NEW. AP_CODE = GEN_ID( GEN_AIRPORT_ID, 1 );

END

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

Конечно, триггер можно оставить, изменив лишь код

IF (NEW. AP_CODE IS NULL ) THEN

NEW. AP_CODE = GEN_ID ( GEN_AIRPORT_ID, 1 );

чтобы если никакое значение столбца AP_CODE при вставке записи из приложения не передано, то оно было сгенерировано автоматически.

Такой код можно получить автоматически при помощи IBExpert.


[1] Получить все столбцы всех строк таблицы PERSON

[2] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSON

[3] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSON с указаниемсинонимов полей

[4] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия:".

[5] Получить соединение имени, фамилии, отчества при помощи операции конкатенации, а также дату рождения из всех строк таблицы PERSON

[6] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия:" упорядочивая по фамилии, а затем по имени

[7] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия:" упорядочивая по полю с номером 2,3

[8] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия:" упорядочивая по фамилии, а затем по полю с номером 2

[9] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия:" упорядочивая по фамилиям в возрастающем порядке, а по именам — в убывающем

[10] Получить имя, фамилию, отчество и дату рождения из всех строк таблицы PERSONс добавлением текста— "Фамилия упорядочивая по датам рождения (с наличием NULL)

[11] Получить имена из всех таблицы PERSON, среди которых не будет повторяющихся

[12] Получить все столбцы из таблицы PERSON, где имя = 'Татьяна'

[13] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех рожденных после 1.01.1970

[14] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех Татьян рожденных после 1.01.1970

[15] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех, чья дата рождения находится в диапазоне от 1.01.1960 до 31.12.1969 (с использованием BETWEEN)

[16] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех, чья дата рождения находится в диапазоне от 1.01.1960 до 31.12.1969 (с использованием >=, <=)

[17] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех Юль, Юлиев и Юлиан (с использованием IN)

[18] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех Юль, Юлиев и Юлиан (с использованием операторов сравнения и OR)

[19] Получить имя, фамилию, отчество из таблицы PERSON, еслифамилия заканчиваться на "ОВ".

[20] Получить имя, фамилию, отчество из таблицы PERSON, если внутри фамилии присутствует "ОВ"

[21] Получить имя, фамилию, отчество из таблицы PERSON, если внутри фамилии присутствует "ОВ" (игнорируя регистр)

[22] Получить имя, фамилию, отчество из таблицы PERSON, если в фамилии после первого символа следует "ОВ"

[23] Получить имя, фамилию, отчество и дату рождения из таблицы PERSON для всех, чья дата рождения находится вне диапазона от 1.01.1960 до 31.12.1969 (с использованием >=, <=)

[24] Получить имя из таблицы PERSONдлячеловека с "максимальной" фамилией

[25] Получить минимальную стоимость билета из таблицы тариф TARIFF

[26] Получить количество всех имен в таблице PERSON (с использованием DISTINCT)

[27] Получить количество дней рождения в таблице PERSON, т.е. количество людей у которых известна дата рождения

[28] Получить число строк в таблице PERSON где имя = 'Татьяна' (количество всех Татьян)

[29] Получить число появления каждого имени таблице PERSON, упорядочивая вывод по найденному количеству (по направлению от большего к меньшему), если количество будет повторяться, сортируем список по имени

[30] Получить число появления каждого имени таблице PERSON, показывая только те имена, которые повторяются более двух раз

[31] Получить все аэропорты с указанием города, где аэропорт расположен (получить все столбцы из таблиц CITY, AIRPORT)

[32] Получить все аэропорты с указанием города, где аэропорт расположен (получить название города и название аэропорта), с заданием синонимов столбцов

[33] Получить все аэропорты с указанием города, где аэропорт расположен (с заданием псевдонимов для имен таблиц)

[34] Получить название всех аэропортов находящихся в городе «Москва»

[35] Получить результат левого внешнего объединения таблиц AIROPORT и CITY - список всех аэропортов с указанием города в том случае, если аэропорт располагается в городе

[36] Получить название аэропортов находящихся вне города (поля из таблицы CITY будут содержать пустые значения (NULL))

[37] Получить результат правого внешнего объединения таблиц AIROPORT и CITY - список всех городов с указанием аэропортов в том случае, если в этом городе есть аэропорты

[38] Получить фамилии с именами и отчествами членов экипажа с указанием их роли, номера авиалинии и даты вылета

[39] Получить фамилию, имя, отчество тех, кто имеет билеты из Перми в Москву на 11.01.2008, вид салона, стоимость билета и занимаемое место (все купившие билеты из Перми в Москву на 11.01.2008, объединение шести таблиц)

[40] Получить суммарную стоимость проданных за 2008 год билетов для каждой из авиакомпаний (результат объединения и группировки)

[41] Получить фамилии, имена, отчества и даты рождения всех однофамильцев (т.е. выводим фамилии, имена, отчества и даты рождения из таблицы PERSON если существует соединение с этой же самой таблицей).

[42] Получить название всех аэропортов находящихся в городе «Москва» (используя подзапрос)

[43] Получить номер маршрута, название аэропортов вылета и прилета, вид салона, стоимость билета для тарифов с минимальной стоимостью билета.

[44] Получить номер маршрута, аэропорт вылета, вид салона и стоимость самого дешевого билета для рейсов вылетающих из города «Пермь»

[45] Получить фамилию, имя, отчество членов экипажа совершивших в феврале 2008 года более одного полета (с использованием подзапроса)

[46] Получить фамилию, имя, отчество пассажиров, которые приобрели более одного билета в течении 2008 года, также выводим номер авиалинии и дату вылета из билета. (с использованием связывания внутреннего и внешнего запросов)

[47] Получить фамилию, имя, отчество пассажиров, которые приобрели более одного билета в течении 2008 года, также выводим номер авиалинии и дату вылета из билета. (с использованием варианта IN, GROUP BY и HAVING в подзапросе)

[48] Получить фамилию, имя, отчество членов экипажа летавших в феврале 2008 года (с использованием оператора EXISTS)

[49] Получить фамилию, имя, отчество членов экипажа летавших в феврале 2008 года (с использованием варианта IN с подзапросом)

[50] Получить фамилию, имя, отчество членов экипажа, которые совершали полет в январе 2008 года, и при этом не разу не летали в феврале (с использованием NOT EXISTS)

[51] Получить фамилию, имя, отчество членов экипажа, которые совершали полет в январе 2008 года, и при этом не разу не летали в феврале (с использованием NOT IN)

[52] Получить фамилию, имя, отчество всех членов экипажа и пассажиров с билетами прилетевших из Перми в Москву за 11.01.2008 (для членов экипажа получаем роль, а для пассажиров номер места указанный в билете)

[53] Добавление одной строки в таблицу CITY

[54] Добавление одной строки в таблицу CITY с использованием подзапроса

[55] Добавление нескольких строк в таблицу EQUIPAGE при помощи команды SELECT (назначение на рейс авиалинии № 901 от ' 16.02.2008 ' тех же самых бортпроводников, которые были назначены ' 14.02.2008').

[56] Изменить фамилию из таблицы PERSON по условию WHERE

[57] Удалить все строки из таблицы TICKET с датой вылета ранее '01.01.2000'

[58] Удалить из таблицы PERSON тех людей кто ни разу не летал в качестве пассажира или члена экипажа (использование вложенного запроса SELECT)

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...