Программирование >>  Программирование баз данных 

1 ... 149 150 151 [ 152 ] 153 154 155 ... 346


Следует отметить, что при определенных обстоятельствах запуск триггера (т.е. вызов на выполнение кода триггера) не производится, даже если, на первый взгляд, осуществляемое действие относится к той категории, на которую должен реагировать триггер. Еще одно условие запуска триггера определяется тем, относится ли операция, выполняемая в базе данных, к категории действий, регжтрируемых в журнале, или нет. Например, действие, связанное с выполнением оператора DELETE, представляет собой обычное регжтрируемое в журнале действие, при обнаружении которого происходит запуск всех соответствующих триггеров DELETE, а оператор TRUNCATE TABLE, выполнение которого также приводит к удалению строк, вызывает лишь освобождение пространства, которое иепользовалось для данных таблицы. Тем не менее при его выполнении не происходит удаление отдельно каждой строки, поэтому триггер не актиеизируетея.

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

Синтаксис оператора CREATE TRIGGER приведен ниже.

CREATE TRIGGER <trigger name>

ON [<schema name>.]<table or view name>

[WITH ENCRYPTION EXECUTE AS <CALLER SELF <user> >] {{{F0RAFTER} <[DELETE] [J [INSERT] [J [UPDATE]>} INSTEAD OF} [WITH APPEND] [NOT FOR REPLICATION]

< <sql statements> EXTERNAL NAME <assembly method specifier> >

Вполне очевидно, что оператор создания триггера имеет знакомую структуру CREATE <object type> <object name>, a также включает в себя такое же определение исполняемого кода, как и во многих других объектах. В этом операторе введена лишь дополнительная конструкция ON, позволяюш;ая указать таблицу, за которой должен быть закреплен триггер, а также задано, когда и при каких условиях должен происходить запуск триггера.

Конструкция on

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

Ключевое слово with encryption

ЬСлючевое слово WITH ENCRYPTION выполняет такие же функции, как и в операторах создания представлений и хранимых процедур. Если указана эта опция, то можно не сомневаться в том, что больше никто не увидит в базе данных исходный код соответствующего программного объекта (даже тот, кто сам его создал!). Такая возможность становится особенно удобной, если разрабатываемое программное обеспечение должно войти в состав коммерческого дистрибутива или к защите предъявляются строгие требования, согласно которым пользователи не должны знать, какие данные модифицируются и как происходит доступ к данным. Безусловно, в таком случае



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

Как и в случае представлений и хранимых процедур, при использовании опции WITH ENCRYPTION следует помнить, что эту опцию необходимо задавать повторно при любом внесении изменений в код триггера с помощью оператора ALTER. Если код триггера модифицируется с помощью оператора ALTER TRIGGER, но при этом не используется опция WITH ENCRYPTION, то в своем новом варианте триггер больше не будет зашифрован.

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

FOR (AFTER) И INSTEAD OF

При определении триггера предусмотрена возможность не только указать, в связи с выполнением каких запросов (с операторами INSERT, UPDATE и (или) DELETE) должен происходить запуск триггера, но и, в определенной степени, определить, как должны быть связаны во времени вьшолнение запроса и запуск триггера. Безусловно, наиболее продолжительную историю применения имеют триггеры FOR (вместо этого ключевого слова, при желании, можно воспользоваться при объявлении триггера ключевым словом AFTER), поэтому многие разработчики привыкли применять триггеры этого типа, но предусмотрена также возможность эксплуатировать так называемые триггеры INSTEAD OF. От выбора триггера того или другого типа зависит, будет ли существовать возможность ввести в действие код триггера до или после модификации данных. Но в любом случае код триггера вызывается на вьшолнение прежде, чем любые внесенные изменения действительно будут зафиксированы в базе данных.

При первом знакомстве с понятием триггера трудно определить, с чем это связано. Приведенное здесь описание можно проще всего понять с помощью схемы, на которой показано, как происходит запуск триггеров FOR (AFTER) и INSTEAD OF (рис. 13.1).

Важно отметить, что независимо от используемого типа триггера для реализации действий, предусмотренных этим триггером в СУБД SQL Server, используются две рабочие таблицы. В одной из этих таблиц хранятся копии всех вставляемых строк (в связи с этим данная таблица именуется INSERTED), а во второй хранятся копии всех удаляемых строк (эта таблица именуется DELETED). Подробные сведения о том, как используются в СУБД эти рабочие таблицы, приведены ниже. А на данный момент достаточно отметить, что при выполнении действий, предусмотренных в коде триггера INSTEAD OF, создание этих рабочих таблиц происходит до проверки каких-либо ограничений, а при обслуживании триггера FOR эти таблицы создаются после проверки ограничений.

Юхючевой особенностью триггера INSTEAD OF является то, что он фактически предназначен для вьшолнения кода, предусмотренного программистом, вместо того кода, выполнение которого обусловлено запросом, поступившим от пользователя. Это означает, что с помощью триггера INSTEAD OF могут быть устранены проблемы неоднозначности при вставке данных в представления (напомним, что в главе 9 был приведен пример, в котором проблема возникала при вставке данных в представление, основанное на использовании оператора JOIN). Это также означает, что с помощью триггера INSTEAD OF могут быть предприняты действия по предотвращению возможных нарушений тех требований, которые обусловлены в ограничениях, даже до того, как произойдет проверка этих ограничений.



На выполнение вызван оператор INSERT INTO...

Начать транзакцию (если таковая не была определена явно)


Заполнить таблицы inserted и deleted

Произведен запуск триггера INSTEAD OF

*IF EXISTS... SELECT.. INSERT..


Проверить ограничения

Выполняет ли триггер INSTEAD OF аналогичное действие в таблице?

Внести оператор в журнал

Заполнить таблицы inserted и deleted

Произвести запуск триггеров FOR/AFTER

Зафиксировать транзакцию (если таковая не была определена явно)

Конец

Рис. 13.1. Блок-схема процедуры запуска триггеров FOR (AFTER) и INSTEAD OF

Триггеры, в объявлении которых используется ключевое слово FOR или AFTER, действуют одинаково. Но триггеры этого типа отличаются от триггеров INSTEAD OF тем, что для них рабочие таблицы создаются после проверки ограничений.



1 ... 149 150 151 [ 152 ] 153 154 155 ... 346

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