Триггеры в InterBase 7.0 на примере программы "Расписание"
Сущность понятия "триггеры". Классификация триггеров и назначение каждого вида. Использование контекстных переменных NEW и OLD и событий InterBase в триггерах. Описание базы данных в среде InterBase 7.0, используемые в программном приложении триггеры.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.12.2010 |
Размер файла | 37,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФИЛЬНОГО ОБРАЗОВАНИЯ
ТЮМЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ МАТЕМАТИКИ И КОМПЬЮТЕРНЫХ НАУК
КАФЕДРА КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ
ФИЛИАЛ В ГОРОДЕ ИШИМЕ
Курсовая работа по теме:
«Триггеры в INTERBASE 7.0 на примере программы «Расписание»
Ишим, 2010
Введение
Целью настоящей курсовой работы было изучить триггеры в СУБД INTERBASE 7.0 и понять основные принципы работы с ними.
Так же была поставлена задача реализовать триггеры в программном приложение «Расписание».
1. Описание триггеров
1.1 Определение триггера
Триггеры - одно из замечательнейших изобретений разработчиков баз данных. Триггеры позволяют придать "активность" данным, хранящимся в базе данных, централизовать их обработку и упростить логику клиентских приложений.
Триггер в InterBase - это особый вид хранимой процедуры, которая выполняется автоматически при вставке, удалении или модификации записи таблицы или представления (view). Триггеры могут "срабатывать" непосредственно до или сразу же после указанного события.
Идея, лежащая в основе триггеров, очень проста.Как известно SQL дает возможность вставлять, удалять и модифицировать данные в таблицах базы данных при помощи соответствующих команд - INSERT, DELETE и UPDATE. Было бы неплохо иметь возможность перехватить передаваемую команду и что-нибудь сделать с данными, которые добавляются, удаляются или изменяются. Например, записать эти данные в специальную таблицу, а заодно записать, кто и когда произвел операцию над данной таблицей. Или сразу же проверить вставляемые данные на какое-нибудь хитрое условие, которое невозможно реализовать с помощью опции CHECK, и в зависимости от результатов проверки принять проводимые изменения или отвергнуть их; изменить эти данные на основании какого-либо запроса или изменить данные в других связанных таблицах. Вот для того, чтобы выполнять какие-либо действия, связанные с изменением данных в базе данных, и существуют триггеры.
1.2 Работа с триггерами
Фактически триггер представляет собой набор команд процедурного языка InterBase, который исполняется при выполнении операций TNSERT/DELETE/UPDATE, но в отличие от хранимых процедур, триггер никогда ничего не возвращает (да и некому возвращать, ведь триггер явно не вызывается). По той же причине он не имеет также входных параметров, но вместо них имеет контекстные переменные NEW и OLD. Эти переменные позволяют получить доступ к полям таблицы, к которой присоединен триггер. Триггеру предназначена роль виртуального цензора, который просматривает "письма" и который волен сделать все, что угодно, - пропустить их неизменными, подправить их, просигнализировать об ошибках или даже "доложить об этом" кому следует. Триггер всегда привязан к какой-то определенной таблице или представлению и может "перехватывать" данные только этой таблицы.
Рассмотрим классификацию триггеров и назначение каждого вида. Как уже было сказано, существует 3 основных SQL-операции, применимые к данным, - INSERT/DELETE/UPDATE. Соответственно первое разделение триггеров - по обслуживаемым операциям. Каждый конкретный триггер привязан к какой-либо операции, т. е. триггер срабатывает, когда в "его" таблице происходит данная операция. Также срабатывание триггера может происходить "до" и "после" операции. Таким образом, мы получаем 6 возможных видов триггеров на таблицу - до и после каждой из трех возможных SQL-операций.
Надо сказать, что триггер, как и хранимая процедура, может содержать в своем теле несколько операторов, разделенных точкой с запятой. Поэтому если вы не используете один из инструментов, рекомендованных в приложении "Инструменты администратора и разработчика InterBase", а работаете с isql, то вам необходимо воспользоваться командой смены разделителя команд SET TERM.
Например:
SET TERM ^;
CREATE TRIGGER DISCIPLINI_BI0 FOR DISCIPLINI
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.nazvanie=new.rashifrovka;
end
SET TERM; ^
Триггер очень напоминает хранимую процедуру (фактически, как уже было сказано ранее, это и есть особая разновидность хранимых процедур), но есть и несколько отличий. Подробно разберем "строение" триггера. Описание команды создания триггера начинается с ключевых слов CREATE TRIGGER, после которых следует имя триггера. Потом следует ключевое слово FOR, после которого указано имя таблицы, для которой создается триггер.
На второй строке команды приводится описание сущности триггера - ключевое слово ACTIVE указывает, что триггер является "активным". Триггер также может быть переведен в состояние INACTIVE. Это означает, что он будет храниться в базе данных, но он не будет срабатывать. Сочетание ключевых слов BEFORE INSERT определяет, что триггер срабатывает до вставки; а ключевое слово POSITION и число после него указывают очередность (позицию) создаваемого триггера среди триггеров того же типа для данной таблицы. Позиция триггера нужна потому, что в InterBase возможно создать более 32000 триггеров каждого вида (например, BEFORE INSERT или AFTER UPDATE), и серверу нужно указать, в каком порядке эти триггеры будут выполняться. Триггеры с меньшей позицией выполняются первыми. Если имеется несколько триггеров с одинаковой позицией, то они будут выполняться в алфавитном порядке. Все рассмотренное выше до ключевого слова AS образует заголовок триггера. После AS следует тело триггера. Собственно в теле и осуществляется основная работа триггера.
1.3 Контекстные переменные
Как уже говорилось выше, триггер похож на цензора, бесцеремонно досматривающего все, что относится к интересующему его предмету. Интерес триггера-"цензора" описан сочетанием ключевых слов BEFORE INSERT - это значит, что все операции вставки (INSERT) вызовут срабатывание триггера. Причем он сработает ДО (BEFORE) того, как вставка физически осуществлена. То есть в момент срабатывания триггера данные, присланные кем-либо на вставку, еще не занесены в таблицу. Они находятся в некотором промежуточном буфере. И у триггера есть возможность обращаться к этому буферу, чтобы проверить и/или изменить значения данных-кандидатов на вставку. Эта возможность реализована с помощью контекстной переменной NEW. Можно рассматривать эту переменную как структуру (что-то подобное struct в Си или record в Pascal), элементы которой представляют собой значения, присланные для осуществления операции (INSERT в нашем примере). То есть внутри триггера мы можем обратиться ко всем полям еще не вставленной записи, используя для этого обращение, например: New. ID, New. Nazvanie и т.п.
Кроме контекстной переменной NEW, существует ее зеркальный аналог - переменная OLD. В отличие от NEW, OLD содержит старые значения записи, которые удаляются или изменяются.
Использование контекстных переменных часто вызывает множество вопросов Дело в том, что в различных видах триггеров NEW и OLD используются по-разному, а в некоторых их вообще невозможно использовать. Контекстная переменная OLD не может быть использована в триггерах BEFORE/AFTER INSERT. А переменная NEW не может быть использована в BEFORE/AFTER DELETE. Обе этих переменные одновременно могут быть использованы в триггерах BEFORE/AFTER UPDATE, причем изменять что-либо можно, только используя переменную NEW (действительно, что можно изменять в удаляющихся значениях, доступных через OLD?), и только в триггерах BEFORE INSERT/UPDATE.
Таблица 1 - Использование контекстных переменных NEW и OLD в триггерах
Тип триггера |
Контекстные переменные |
||||
NEW |
OLD |
||||
Читать |
Изменять |
Читать |
Изменять |
||
BEFORE INSERT |
Можно |
Можно |
Нельзя |
Нельзя |
|
AFTER INSERT |
Можно |
Нельзя |
Нельзя |
Нельзя |
|
BEFORE UPDATE |
Можно |
Можно |
Можно |
Нельзя |
|
AFTER UPDATE |
Можно |
Нельзя |
Можно |
Нельзя |
|
BEFORE DELETE |
Можно |
Нельзя |
Можно |
Нельзя |
|
AFTER DELETE |
Можно |
Нельзя |
Можно |
Нельзя |
Наиболее широкие возможности предоставляет использование NEW и OLD в операции обновления. Ведь таким образом мы можем сравнить текущее (OLD) и новое (NEW) значения и предпринять какие-то действия.
1.4 Управление состоянием триггера
По умолчанию триггер создается активным, т. е. он будет срабатывать при осуществлении соответствующей операции. Состоянием триггера управляет ключевое слово ACTIVE в заголовке. Если же триггер сделать неактивным, то он не будет исполняться при возникновении операции. Это бывает полезным при осуществлении каких-либо внеплановых операций над данными, например при массовой заливке данных или ручном исправлении данных. Чтобы отключить триггер, необходимо выполнить команду DDL: ALTER TRIGGER <tngger_name> INACTIVE;
Это команда относится к Data Definition'Language, и ее нельзя вызвать из хранимых процедур или других триггеров. Вообще говоря, существует способ управлять состоянием триггеров с помощью модификации системных таблиц. Конечно, модификация системных таблиц является недокументированным способом работы с триггерами и она не рекомендуется, но для иллюстрации возможностей работы с системными таблицами InterBase можно привести пример: UPDATE rdb$triggers trg SET erg idЈ>$t.rigger_inactive = l WHERE trg.rdb$trigger_name='TABLE_EXAMPLE_AD0'
Эта команда аналогична по действию вышеприведенной команде DDL, но ее можно вызывать в других триггерах и процедурах. Часто такую возможность принимают за хороший способ управлять цепочками триггеров, т.е. в одном триггере или хранимой процедуре включать или выключать нужные триггеры и таким образом управлять обработкой данных, включая или выключая нужные триггеры. Однако изменять состояние триггеров "налету" не удастся. Дело в том, что триггеры работают в рамках той же транзакции, что и вызвавшее их изменение. Поэтому если один триггер изменит состояние другого в зависимости от каких-либо условий, то механизм "активных таблиц", который занимается запуском триггеров (хоть мы и говорим, что триггер запускается неявно, но "кто-то внутри сервера" должен их все-таки запускать!), не увидит эти изменения, так как они еще не подтверждены! Таким образом, в рамках одной транзакции нельзя управлять состоянием триггеров. Если сделать подтверждение транзакции, в которой выполнился первый триггер, который выключил (или включил) второй триггер, а затем запустить снова транзакцию, то мы увидим изменения в состоянии второго триггера. Но какой смысл это делать, ведь суть идеи состояла в том, чтобы включать триггеры на лету, не теряя значения в буфере контекстных переменных NEW или OLD.В общем, это был пример того, что не следует делать в триггерах.
Другим примером того, чего не следует делать в триггерах, является изменение данных в той же таблице, к которой привязан триггер, не через контекстные переменные, а с помощью обычных SQL-команд INSERT/UPDATE/DELETE. Например, некий триггер на вставку вызывает хранимую процедуру, внутри которой происходит вставка записи в ту же таблицу. Вставка опять вызовет срабатывание нашего триггера, и возникнет зацикливание. Следует очень внимательно относиться к использованию триггеров, так как зацикливание в ряде случаев может привести к аварийному завершению сервера InterBase.
1.5 Ошибки и исключения в триггерах
Если база достаточно сложная (лучше сказать, достаточно реальная), то никак не избежать появления ошибок. Более того, ошибки типа "конфликт с другими пользователями" являются повседневным и нормальным явлением в многопользовательской среде.
Как InterBase обрабатывает ошибки в триггерах? Ведь ситуация может быть достаточно нетривиальная - например, вставка записи в главную таблицу запускает хранимую процедуру, которая вставляет записи в подчиненные таблицы, причем при вставке в подчиненные таблицы срабатывают триггеры на вставку, которые получают новые значения генераторов и подставляют их в нужные поля. Можно представить не один подобный уровень вложенности. Что произойдет, когда где-то в "дальних" ветках этого дерева событий возникнет ошибка?
При возникновении ошибок на любом этапе - в триггере, в вызываемых им хранимой процедуре или в неявно активизируемых других триггерах - InterBase сообщит об ошибке и откатит изменения в таблицах, проведенные в рамках инициировавшего эту цепочку оператора. Оператор - это предложение INSERT/UPDATE/DELETE или SELECT, а также EXECUTE PROCEDURE. Таких операторов может быть в транзакции несколько. Отменяется все действия только в рамках оператора, вызвавшего ошибку. Клиентское приложение может отследить возникновение ошибки и подтвердить транзакцию. Другими словами, ошибка в триггере не обязательно требует отката транзакции. Клиентское приложение может обработать ошибку, полученную при выполнении оператора и, например, выполнить вместо этих изменений какие-то другие, если такова логика предметной области, или изменить логику выполнения дальнейших изменений в этой транзакции и подтвердить реально выполненные в транзакции изменения.
Если возникает ошибка, то InterBase посылает клиентскому приложению сообщение об ошибке, которое мы вольны обработать или нет, - в любом случае InterBase уже выполнил свою миссию - откатил ошибочное действие в триггере. Однако есть и другой путь. Мы можем воспользоваться обработкой ошибочных ситуаций непосредственно в теле триггера (или хранимой процедуры) с помощью конструкции WHEN...DO. Использование этой конструкции аналогично применению ее в хранимых процедурах, и подробнее об использовании WHEN...DO. Точно так же как и в хранимых процедурах, в триггерах можно возбуждать собственные исключения. Так как триггер фактически представляет собой разновидность исполнимой хранимой процедуры, то возбуждение в нем исключения прервет работу триггера и приведет к отмене всех действий, совершенных в триггере, - явных и неявных.
2. Использование событий InterBase в триггерах
Одной из мощных возможностей InterBase, часто используемых в триггерах, являются события (events). События представляют собой строковые сообщения, которые могут быть посланы из триггера или хранимой процедуры. Получат эти события те клиенты InterBase, которые зарегистрированы как заинтересованные в данных событиях. Таким образом, можно оповещать клиента о каких-то изменения внутри базы данных. События не являются постоянным объектом базы данных - они нигде в базе данных не хранятся, не создаются и не модифицируются, а порождаются "на лету". Чтобы послать какое-то событие, необходимо воспользоваться следующей конструкцией:
POST_EVENT 'текст_сообщения';
Надо сказать, что 'текст_сообщения' может браться из переменной и, таким образом, можно порождать события динамически, например так:
If (<условие, записанное в виде выражения типа Boolen>) then BEGIN Event_text = ' вводим сообщение TRUE '; END ELSE BEGIN Event_text = ' вводим сообщение FALSE '; END FALSE_EVENT:Event_text;
Однако, если ни одно клиентское приложение, соединенное с базой данных, в которой порождаются какие-то события, не является зарегистрированным на получение этих событий, то все они "уйдут в эфир" и фактически пропадут. Для регистрации (подписки) на получение нужных событий используют специальные функции InterBase API, которые реализованы, например, в библиотеке FIBPlus - в компоненте SuperlBAlerter. Как только приложение регистрируется для получения какого-либо события, запись об этом заносится в таблицу блокировок InterBase, которая является единой для всех пользователей сервера InterBase, и сервер начинает просматривать все порождаемые события на предмет появления зарегистрированных данным клиентом. Если такое событие появляется, то клиентское приложение получает соответствующий сигнал, на который может отреагировать каким-либо образом. События в триггерах являются удобным механизмом для организации протокола изменений в определенных таблицах.
3. Реализация триггеров в базе данных «Расписание»
Рассмотрим использование триггеров в InterBase на примере программы составления расписания занятий групп учащихся филиала ТюмГУ в городе Ишиме.
3.1 Описание базы данных
База данных реализована в среде INTERBASE 7.0 и содержит 10 таблиц.
Таблица DISCIPLINI представляет собой справочник преподаваемых дисциплин.
Таблица 2 - DISCIPLINI
Имя поля |
Назначение |
|
KODDISCIPLINI |
Уникальный идентификатор дисциплины (первичный ключ) |
|
NAZVANIE |
Краткое (сокращенное) название дисциплины |
|
RASHIFROVKA |
Полное название дисциплины |
|
CIKL |
Внешний ключ на таблицу «Цикл» |
Таблица GRUPI является справочником групп.
Таблица 3 - «GRUPI»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор группы (первичный ключ) |
|
KODSPECIALNOSTI |
Код специальности группы |
|
KYRS |
Курс |
|
NOMERGRUPI |
Номер группы |
|
OTDELENIEGRUPI |
Отделение (очное/заочное) |
Таблица PREPODOVATELI - справочник преподавателей.
Таблица 4 - «PREPODOVATELI»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
FIO |
Фамилия, имя и отчество преподавателя |
|
MESTNII |
Местный или приезжий преподаватель |
Таблица AUDITORII является справочником аудиторий.
Таблица 5 - «AUDITORII»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
ZDANIE |
Внешний ключ на таблицу «Здания» |
|
NOMERAUDITORII |
Номер аудитории |
|
TIP |
Тип аудитории |
В таблице YCHEBNIIPLAN хранится информация об учебном плане:
Таблица 6 - «YCHEBNIIPLAN»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
KODSPECIALNOSTI |
Специальность |
|
OTDELENIE |
Отделение (очное/заочное) |
|
SEMESTR |
Семестр |
|
LEKCII |
Количество лекций |
|
PRAKTIKI |
Количество практик (семинаров) |
|
OTCRTNOST |
Вид отчетности (экзамен, зачет, курсовая, контрольная и т.п.) |
|
DISCIPLINA |
Название дисциплины (внешний ключ) |
В таблице NAGRYZKA будет храниться информация о нагрузке на преподавателей.
Таблица 7 - «NAGRYZKA»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
GRUPI |
Группа (внешний ключ) |
|
PREPODAVATEL |
Преподаватель (внешний ключ) |
|
YCEBNIIPLAN |
Учебный план (внешний ключ) |
В таблице STROKAVRASPISANII будут храниться строки в расписании.
Таблица 8 - «STROKAVRASPISANII»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
AUDITORIA |
Аудитория (внешний ключ) |
|
NAGRYZKA |
Нагрузка (внешний ключ) |
|
RASPISANIE |
Расписание (внешний ключ) |
|
TIPPARI |
Тип пары |
Таблица RASPISANIE является сводной таблицей. Она содержит расписание занятий.
Таблица 9 - «RASPISANIE»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
DATA |
День |
|
NOMERPARI |
Номер пары |
Таблица CIKL является сводной таблицей. Она содержит расписание занятий.
Таблица 10 - «CIKL»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
NAZVANIE |
Название цикла |
Таблица ZDANIA является сводной таблицей. Она содержит расписание занятий.
Таблица 11 - «ZDANIA»
Имя поля |
Назначение |
|
ID |
Уникальный идентификатор (первичный ключ) |
|
NAZVANIE |
Название цикла |
|
ADRESS |
Адрес здания |
3.2 Описание используемых триггеров
триггер переменная interbase база данные
Триггер автоматически присваивает значению сокращенного названия дисциплины значение полного названия после добавления новой записи, если поле пустое, и полное название дисциплины не длиннее 25 символов:
ALTER TRIGGER DISCIPLINI_BI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
if ( ( new.nazvanie is null ) and ( length(new.rashifrovka) <26 ) )then
begin
new.nazvanie=new.rashifrovka;
end
end
Триггер автоматически присваивает значению название здания значение адреса здания после добавления новой записи, если поле пустое, и адрес здания не длиннее 27 символов:
ALTER TRIGGER ZDANIA_BI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
if ( ( new.nazvanie is null ) and ( length(new.adress) <28 ) )then
begin
new.nazvanie=new.adress ;
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице AUDITORII, если поле пустое (не заполнено):
ALTER TRIGGER AUDITORII_AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id1, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице ZDANIA, если поле пустое (не заполнено):
ALTER TRIGGER ZDANIA _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id2, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля KODDISCIPLINI в таблице DISCIPLINI, если поле пустое (не заполнено):
ALTER TRIGGER DISCIPLINI _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new. KODDISCIPLINI IS NULL) THEN
begin
new. KODDISCIPLINI = gen_id (generator_id3, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице CIKL, если поле пустое (не заполнено):
ALTER TRIGGER CIKL _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new. ID IS NULL) THEN
begin
new. ID = gen_id (generator_id4, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице GRUPI, если поле пустое (не заполнено):
ALTER TRIGGER GRUPI _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id5, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице NAGRYZKA, если поле пустое (не заполнено):
ALTER TRIGGER NAGRYZKA _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id6, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля id в таблице PREPODOVATELI, если поле пустое (не заполнено):
ALTER TRIGGER PREPODOVATELI _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id7, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице RASPISANIE, если поле пустое (не заполнено):
ALTER TRIGGER RASPISANIE _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id8, 1);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице STROKAVRASPISANII, если поле пустое (не заполнено):
ALTER TRIGGER STROKAVRASPISANII _AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id91);
end
end
Триггер автоматически увеличивает значение ключевого поля ID в таблице YCHEBNIIPLAN, если поле пустое (не заполнено):
ALTER TRIGGER YCHEBNIIPLAN_AI0
ACTIVE AFTER INSERT POSITION 0
AS
begin
IF (new.id IS NULL) THEN
begin
new.id = gen_id (generator_id10, 1);
end
end
Заключение
Триггеры являются мощным средством для реализации бизнес-логики на стороне сервера. Размещение операций обработки данных в триггерах позволяет упростить и централизовать бизнес-логику приложений, но одновременно несет в себе определенные трудности, связанные с отладкой приложений СУБД на уже работающих базах.
В любом случае при разработке достаточно сложных приложений для СУБД InterBase использование триггеров является одной из возможностей сделать работу создателя СУБД проще и приятнее. Мною было реализовано несколько триггеров в INTERBASE 7.0.
Список литературы
1. Коннолли Томас, Бегг Каролин. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. 3-е издание.: Пер. с англ. - М.: Издательский дом "Вильямс", 2003. - 1440 с.
Размещено на Allbest.ru
Подобные документы
Типичные бизнес-процессы и способы ведения складского учета. Инвентаризация материально-производственных запасов. Разработка базы данных для хранения информации, необходимой для автоматизации работы оптового склада с использованием СУБД Interbase 7.5.
дипломная работа [3,1 M], добавлен 17.04.2015Разработка клиентского приложения для информационной системы "Работа торгового склада" с помощью языка объектно-ориентированного программирования Delphi 6 и технологии InterBase Express. Описание реляционной модели данных и этапы ее проектирования.
курсовая работа [1,0 M], добавлен 19.03.2009Алгоритм разработки базы данных и сопровождающей ее программы, предназначенных для автоматизированного учета услуг спортивного клуба. Инфологическое, даталогическое проектирование. Разработка приложений баз данных в среде Visual FoxPro 5.0 InterBase.
курсовая работа [593,9 K], добавлен 01.04.2013Создание логической модели данных. Назначение кнопок Erwin Toolbox. Создание БД в СУБД InterBase. Использование утилиты WISQL. Создание Script-файла. Перенос структуры данных с одного сервера на другой. Синхронизация каталога БД и текущей модели.
курсовая работа [4,6 M], добавлен 26.11.2011Разработка информационной системы, выбор языка программирования, физическое описание базы данных, выбор типа и описание таблиц базы данных. Техническое проектирование, ограничения и значения по умолчанию, представления, хранимые процедуры и триггеры.
курсовая работа [519,8 K], добавлен 25.05.2010Обработка курсора в PL/SQL. Объявление курсора и атрибуты курсора. Использование команд OPEN, FETCH и CLOSE. Исключительные ситуации в PL/SQL. Стандартные исключительные ситуации. Различные ситуации срабатывания триггера. Порядок активизации триггеров.
презентация [307,9 K], добавлен 14.02.2014Ограничения, присутствующие в предметной области. Проектирование инфологической модели данных. Описание основных сущностей и их атрибутов. Логический и физический уровни модели данных. Реализация базы данных: представления, триггеры, хранимые процедуры.
курсовая работа [1,7 M], добавлен 10.02.2013Разработка программного приложения для автоматизации рабочего места кладовщика на центральном складе предприятия. Решение задачи создания клиент-серверной архитектуры базы данных в среде программирования Delphi 7 и Interbase для "Windows 9X(NT)".
дипломная работа [1,8 M], добавлен 19.06.2012Разработка инфологической и даталогической моделей. Особенности реализации базы данных оказания платных образовательных услуг в СУБД Visual Foxpro и Interbase. Описание и обоснование набора введенных индексов, правил поддержки ссылочной целостности.
курсовая работа [291,3 K], добавлен 21.05.2013Изучение структуры и алгоритмов работы асинхронных и синхронных триггеров в счетном режиме. Исследование функций переходов и возбуждения основных типов триггеров. Рассмотрение взаимозаменяемости функциональных электронных устройств различных типов.
лабораторная работа [394,7 K], добавлен 19.01.2015