|
Программирование >> Построение запросов sql
Триггер является мощным инструментом контроля изменений данных в БД, а также помогает автоматизировать операции, которые должны выполняться в этом случае. Триггер выполняется после проверки правил обновления данных. Триггер включает в себя две компоненты: - ограничения, для реализации которых он создается; - событие, характеризирующее возникновение ситуации, требующей проверки ограничений. Предусмотренное действие производится за счет выполнения определенной операции или последовательности операций, с помощью которых реализуется логика, требуемая для удовлетворения ограничений. События возникают при изменении содержимого таблицы. Действие, вызываемое событием, задается последовательностью запросов SQL и операторов процедурного языка Firebird. Триггеры являются частью работы транзакции, в которой событие DML изменяет состояние строки. Если транзакция успешно подтверждается, то все действия триггеров принимаются. Если будет выполнен откат транзакции, то все действия триггера будут отменены. В Firebird триггер определяется запросом CREATE TRIGGER, имеющим следующий формат: CREATE TRIGGER имя триггера FOR { базовая таблица представление } [ACTIVE INACTIVE] { BEFORE AFTER } <событие1> [OR <событие2> [OR <событие3>] [ [POSITION приоритет триггера] AS <тело триггера> [ разделитель ], <событие> :: ={ DELETE INSERT UPDATE }. Определение триггера состоит из заголовка и тела. Заголовок содержит: - имя создаваемого триггера; - имя таблицы или модифицируемого представления, для которых создается триггер; - состояние триггера (активный или неактивный); - описание связи с событиями, при наступлении которых триггер должен сработать; - приоритет выполнения триггера над другими триггерами, если те связаны с той же таблицей (представлением). В заголовке триггера его активность определяется указанием ключевого слова ACTIVE. Триггер можно отключить , если использовать в заголовке триггера ключевое слово INACTIVE. По умолчанию любой триггер создается активным, т.е. не обязательно указывать ключевое слово ACTIVE при определении нового триггера. Явное указание ACTIVE может потребоваться при включении неактивного триггера (как можно модифицировать ранее созданный триггер будет подробно описано далее). Триггер может выполняться в одной из двух фаз: BEFORE или AFTER. BEFORE указывает на то, что триггер должен сработать до указанных событий, а AFTER активизирует работу триггера после наступления указанных событий. DELETE, INSERT и UPDATE задают три типа событий, на которые триггер реагирует соответственно при удалении, вставке или обновлении таблицы, для которой создан триггер. Возможно объединение действий для двух или трех событий DML в одном триггере. В то же время в базе данных может быть создано несколько триггеров, которые ассоциированы с одной и той же таблицей, одним и тем же событием и имеют одну и ту же фазу. При этом для одной таблицы (представления) можно создать не более 32768 триггеров. Порядок выполнения таких триггеров устанавливается с помощью параметра предложения POSITION. Значение приоритет триггера может меняться от 0 до 32767. Триггеры с меньшими номерами выполняются первыми. Если же несколько триггеров имеют один и тот же приоритет, то они выполняются в алфавитном порядке их имен. Тело триггера задает последовательность действий, которая будет реализована СУБД при наступлении контролируемых событий над заданной таблицей или представлением. Тело триггера, как и тело ХП, состоит из списка объявления используемых локальных переменных и блока выполняемых операторов: <тело триггера> [<список объявления переменных>] <блок операторов>, где <список объявления переменных> и <блок операторов> имеют такой же синтаксис, который был описан ранее. Рассмотрим пример триггера для одного события. Пусть требуется перед удалением записей в таблице Executor сохранять в таблице History информацию о ФИО всех исполнителей ремонтных заявок и дате, до которой данная информация была актуальна. Скрипт для создания триггера Executor Delete, реализующего решение данной задачи, будет выглядеть следующим образом: CONNECT c:\sqllab.fdb USER SYSDBA PASSWORD masterkey; /* создание в тексте SQL сценария таблицы History */ CREATE TABLE History (ID INTEGER PRIMARY KEY, Executor List VARCHAR(300), FixDate DATE); /* создание генератора*/ CREATE SEQUENCE Gen History; /* установка начального значения генератора*/ ALTER SEQUENCE Gen History RESTART WITH 0; SET TERM !! ; /*установка нового разделителя*/ /* определение триггера */ CREATE TRIGGER Executor Delete FOR Executor ACTIVE BEFORE DELETE DECLARE VARIABLE Line VARCHAR(32000); BEGIN /* вызов хранимой процедуры для записи ФИО всех исполнителей в переменную Line */ EXECUTE PROCEDURE SampleThree(Fio,Executor) RETURNING VALUES Line; /* вставка строки в таблицу History */ INSERT INTO History VALUES (NEXT VALUE FOR Gen History, :Line, CURRENT DATE); END!! /*конец оператора CREATE TRIGGER */ SET TERM ; !! /*установка стандартного разделителя */. В приведенном скрипте сначала производится создание таблицы History, а также определение и установка начального значения генератора GenHistory, используемого для получения уникального значения поля первичного ключа таблицы History. Затем создается триггер ExecutorDelete, который будет запускаться перед наступлением события удаления строки из таблицы Executor. Триггер вызывает ранее созданную процедуру SampleThree, осуществляющую запись в переменную Line ФИО всех исполнителей ремонтных заявок, разделенных запятыми. Значение, полученное в переменной Line и дата, до которой информация была актуальна (дата удаления записей, т.е. текущая дата), записываются в таблицу History с помощью запроса INSERT, размещенного в теле триггера. Следует обратить внимание на следующие особенности: - отсутствие точки с запятой перед переменной Line в предложении RETURNINGVALUES; - использование двоеточия перед переменной Line в списке значений VALUES запроса INSERT. Двоеточие указывает на использование локальной переменной, а не имени столбца таблицы. Характерной особенностью триггеров является то, что в них может использоваться ряд контекстных переменных, которые нельзя использовать в Основным средством реализации возможностей триггеров по отслеживанию целостности данных являются контекстные переменные OLD и NEW. Переменные используются в следующем виде: {OLD NEW}.столбец . Контекстная переменная OLD ссылается в строке на текущие или предыдущие значения, которые обновляются или удаляются соответственно запросами UPDATE или DELETE в таблице, для которой создан триггер. Таким образом, переменная OLD не используется при вставке, т.к. старого значения не существует. Переменная OLD является контекстной переменной только для чтения, поэтому попытка присвоить какое-либо значение переменной OLD.столбец будет отклонена. Контекстная переменная NEW ссылается в строке на новые значения, которые будут вставлены или обновлены соответственно запросами INSERT
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |