Программирование >>  Sql: полное руководство 

1 ... 192 193 194 [ 195 ] 196 197 198 ... 264


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

Microsoft SQL Server предоставляет профаммистам набор системных внешних процедур, обеспечиваюших доступ к функциям операционной системы. Например процедура xp sendmail позволяет отправлять пользователям электронные почтовые сообщения с информацией о событиях, происходящих в базе данных:

XP SENDMAIL @RECIPIENTS = Joe, Sam, @MESSAGE = Отчет готов;

Другая процедура, xp CMDSHELL, выполняет команды операционной системы, в которой работает SQL Server. Допускается также создание пользовательских внешних процедур, которые хранятся в библиотеках динамической компоновки (DLL) и вызываются из хранимых процедур SQL Server.

Informix обеспечивает доступ к функциям операционной системы с помощью специальной инструкции SYSTEM. Кроме того, эта СУБД поддерживает пользовательские внешние процедуры, для объявления которых предназначена инструкция creATE procedure. Там, где обычно начинается тело хранимой процедуры Informix, помещается предложение external, в котором задается имя, местоположение и язык внешней процедуры. Объявленную таким образом процедуру можно вызывать как обычную хранимую процедуру Informix.

Ту же возможность предоставляют и новые версии Oracle (OracleS и выше) - в них внешние процедуры тоже объявляются с помощью инструкции create procedure. Семейство продуктов DB2 компании IBM обеспечивает аналогичный набор возможностей.

Триггеры

Триггер - это особая хранимая процедура, которая вызывается в ответ на модификацию содержимого базы данных. В отличие от хранимых процедур, созданных с помощью инструкции create procedure, триггер нельзя выполнить с помощью инструкции call или execute. Каждый триггер связывается с определенной таблицей базы данных, и СУБД сама выполняет его, когда данные в таблице изменяются

(инсфукцией insert, delete ИЛИ update).

Триггеры могут использоваться для автоматического обновления информации в базе данных. Предположим, вы хотите настроить базу данных таким образом, чтобы каждый раз, когда в таблицу служащих помещается новая запись, план нового служащего добавлялся к плановому объему продаж офиса, в котором он работает. Вот триггер для Oracle PL/SQL, который выполняет эту задачу:

create trigger upd tgt

/* триггер, активизирующийся при добавлении записи

в таблицу SALESREPS */ before insert on salesreps for each row

when (new.quota is not null)



begin

update offices

set target = target + new.quota;

end;

Инструкция create trigger исполъзуется В болъшинстве ведущих СУБД для создания нового триггера, включаемого в базу данных. Она назначает триггеру имя (в нашем примере upd tgt), указывает, с какой таблицей его следует связать (salesreps) и в ответ на какие события он должен вызываться (в нашем случае таким событием является выдача инструкции insert). Далее следует тело триггера, которое, как и у обычных хранимых процедур, определяет последовательность инструкций, вьшолняемых при его вызове. В нашем примере для каждой записи, добавляемой в таблицу, должна быть вьшолнена указанная инструкция update, обновляющая таблицу offices. Доступ К ПОЛЮ quota добавляемой записи можно получить с помощью выражения new. quota.

Преимущества и недостатки триггеров

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

м Контроль изменений. Триггер может отслеживать и отменять определенные изменения, не разрешаемые в конкретной базе данных.

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

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

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

В каждом из этих случаев фиггер реализует набор деловых правил, налагаемых на содержимое базы данных. Благодаря тому что эти правила хранятся в базе данных Ценфализованно (т.е. только в одном месте - в определении фиггера) и фиггер выполняется в СУБД автоматически, эти правила распросфаняются на все операции, выполняемые над базой данных ее собственными хранимыми процедурами и всеми внешними приложениями. Если их нужно изменить, достаточно сделать это в одном-единственном месте.

Главным недостатком фИГгеров является их влияние на производительность операций с базой данных. Если с некоторой таблицей связан фиггер, СУБД вьшолняет его каждый раз, когда эта таблица обновляется. И если от базы данных фебуется очень бысфое добавление и модификация больших объемов данных, фиггеры могут оказаться неприемлемым решением. Тем более что перед проведением пакетных Операций данные могут быть проверены заранее и наверняка будут удовлетворять всем требованиям целостности. По этой причине некоторые СУБД позволяют избирательно активизировать и отключать фиггеры по мере необходимости



Триггеры в диалекте Transact-SQL

в Transact-SQL триггеры создаются инструкцией create trigger (как в Microsofl SQL Server, так и в Sybase Adaptive Server). Вот определение приведенного выще триггера [JPD tgt на диалекте Transact-SQL:

create trigger upd tgt

/* триггер, активизирующийся при добавлении записи

в таблицу SALESREPS */ on salesreps for insert as

if (@@rowcount = 1) begin

update offices

set target = target + inserted.quota from offices, inserted where offices.office = inserted.rep office

end else

raiserror 23456

Первое предложение определяет имя триггера (upd tgt). Второе указывает, с какой таблицей он связан (оно является обязательным). Третье предложение также обязательно и определяет операцию, в ответ на которую должен выполняться данный триггер. В данном случае мы определяем триггер, активизируемый при добавлении данных. Кроме инструкции insert можно связывать триггеры с инструкциями update и delete, причем триггер может быть связан с одной, любыми двумя или всеми тремя инструкциями сразу - они перечисляются через запятую. Однако для любой из Этих трех операшй с таблицей может быть связан только один триггер. Тело триггера начинается с ключевого слова as. Чтобы понять, что делает наш триггер, необходимо разобраться, как Transact-SQL обрабатывает строки таблицы при ее модификации.

Специально для триггеров Transact-SQL определяет две виртуальные таблицы, структура которых идентична структуре таблицы, с которой связан триггер. Эти таблицы называются deleted и inserted. Они заполняются строками из модифицируемой таблицы, причем их конкретное содержимое зависит от выполняемой операции:

delete - все строки, удаленные из связанной таблицы, помещаются в таблицу deleted, таблица inserted пуста;

insert - все строки, добавленные в связанную таблицу, помещаются в таблицу inserted, таблица deleted пуста;

update - для каждой строки связанной таблицы, измененной инструкцией update, ее исходная версия помешается в таблицу deleted, а новая версия - в таблицу inserted.

К этим двум виртуальным таблицам можно обращаться из тела триггера, и их данные можно использовать в триггере наряду с данными всех остальных таблиц В нашем примере триггер проверяет, была ли в таблицу добавлена одна запись, дяя чего он обращается к системной переменной @@rowcount. Если это так, значение столбца quota из виртуальной таблицы inserted прибавляется к значению столбца target соответствующей строки таблицы offices. Чтобы найти в таблице offices соответствующую запись , мы объединяем эту таблицу с виртуальной таблицей inserted по идентификаторам офисов.



1 ... 192 193 194 [ 195 ] 196 197 198 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика