Мониторинг обменных курсов валют
18c0693f

Триггеры



Триггеры - это определяемые пользователем действия, которые выполняются, когда над таблице, к
которой прикреплен триггер, выполняются операции INSERT, UPDATE или DELETE. В SQLBase
действия триггера являются хранимыми процедурами. Иными словами, пользователь создает
хранимые процедуры, которые описывают действия, совершаемые триггерами.

В SQLBase триггеры используются для решения трех основных задач:


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

Триггер может быть определен для выполнения либо перед операцией insert/update/delete (before
триггер), либо после нее (after триггер). Типичный пример использования before триггеров -
проверка данных. After триггеры полезны в тех случаях, когда хранимая процедура триггера
содержит код, анализирующий содержимое таблицы, на которой определен триггер, и этот код
должен включать результаты последней операции insert/update/delete.

Операции insert/update/delete, которые содержат предложения WHERE или суб-запросы (sub-
selects), модифицируют более одной строки таблицы. Триггеры SQLBase могут быть
сконфигурированы таким образом, чтобы запускаться только один раз за всю операцию или
каждый раз при изменении отдельной строки.

Update триггеры могут быть определены таким образом, чтобы запускаться только при изменении
отдельных колонок таблицы (селективные update триггеры) или реагировать на любое изменение
данных в таблице.

При передаче данных в процедуры триггеров можно использовать следующие типы данных в
качестве параметров процедур:


Если в процессе выполнения операции UPDATE содержимое колонки изменяется, имеется


возможность передать в процедуру триггера как старое, так и новое значение колонки. Для этого
служит предложение REFERENCING в определении триггера. Если предложение REFERENCING
не используется, по умолчанию значение колонки является старым для before update триггеров и
новым для after update триггеров. Поскольку для insert триггеров старых значений не существует,
значение колонки по умолчанию является новым. Аналогично, значение колонки для delete
триггера является старым.

Ограничения триггеров


Пример триггера

Ниже приведен пример триггера, который реагирует на обновление колонки в таблице.
Предположим, мы имеем таблицу T1, содержащую целочисленную колонку C1 и таблицу T2 с
колонками (OldC1 int, NewC1 int, Updater char(10)). В триггер передаются старое и новое значение
колонки C1 и имя пользователя. Триггер затем вводит эту информацию в таблицу T2. (Отметим
возможность определения хранимой процедуры триггера непосредственно в теле триггера с
помощью оператора INLINE.)

create trigger tg1 before update of c1 on t1
referencing old as o new as n
(execute inline (o.c1, n.c1, user)
procedure p1 static
parameters
number: old
number: new
string: updater
actions
call sqlimmediate( 'insert into t2 values (:old, :new, :updater)' )
for each row;





Самый выгодный курс обмена валюты