Программирование >>  Построение запросов sql 

1 ... 82 83 84 [ 85 ] 86 87 88 ... 101


Изменение заголовка триггера может быть использовано, например, для отключения триггера в следующем виде:

ALTER TRIGGER Str DELETE INACTIVE;.

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

ALTER TRIGGER Request INSERT AS

BEGIN

IF ((NEW.AccountCD IS NULL) OR (NEW.ExecutorCD IS NULL)

OR (NEW.FailureCD IS NULL)) THEN

EXCEPTION E Request; END.

Изменение (точнее, замещение) всего триггера (как заголовка, так и тела) следует реализовывать в тексте SQL сценария. При этом можно использовать запрос ALTER TRIGGER (применение запроса CREATE TRIGGER вызовет ошибку, так как к моменту изменения триггер уже существует).

Часто удобнее использовать запрос CREATE OR ALTER TRIGGER, который создает триггер, если он еще не существует, или изменяет триггер с указанным именем и перекомпилирует его. При этом имеющиеся зависимости и привилегии сохраняются.

Если требуется заново создать триггер со старым именем, то используется запрос RECREATE TRIGGER. Синтаксис этого запроса такой же, как и запроса CREATE TRIGGER. Если триггер с указанным именем уже существует, то запрос RECREATE TRIGGER пытается удалить его и создать полностью новый объект (что не будет выполнено, если триггер находится в использовании).

Для удаления триггера используется запрос DROP TRIGGER, который имеет следующий формат:

DROP TRIGGER имя триггера;.

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

DROP TRIGGER Str DELETE;.

6.3.2. Триггеры базы данных

Как было отмечено ранее, кроме триггеров DML существуют триггеры БД [20]. Они предоставляют возможность производить определяемые пользователем действия при выполнении подключения к БД и отключении от нее, а также при запуске, успешном завершении или откате транзакции.



Синтаксис запроса на создание или изменение триггера БД имеет следующий вид:

{CREATE RECREATE CREATE OR ALTER} TRIGGER имя триггера

[ACTIVE INACTIVE]

ON <событие>

[POSITION приоритет триггера[ AS <тело триггера>,

где <событие> {CONNECT DISCONNECT TRANSACTION START TRANSACTION COMMIT TRANSACTION ROLLBACK }.

События CONNECT и DISCONNECT возникают при выполнении команд подключения к БД и отсоединения от БД, которые были описаны ранее при изучении SQL-скриптов. Событие TRANSACTION START возникает при запуске новой транзакции, т.е. автоматически вместе с первым SQL-запросом или непосредственно после окончания предыдущей транзакции. События TRANSACTION COMMIT и TRANSACTION ROLLBACK возникают при выполнении команд COMMIT или ROLLBACK соответственно, которые означают завершение транзакции (фиксацию или откат) и будут подробно рассмотрены далее.

Если сравнить данный синтаксис с синтаксисом определения триггеров DML, то можно выделить следующие особенности:

- не указывается конкретная таблица (представление), для которой создается триггер;

- в качестве событий используются подключение к БД, отключение от БД, старт, успешное завершение и откат транзакций;

- отсутствует указание фазы BEFORE или AFTER для событий.

Следует отметить, что только владелец БД или SYSDBA могут создавать триггеры БД, в то время как триггер DML может быть определен любым другим пользователем, если он является владельцем таблицы, для которой создается триггер.

Рассмотрим пример создания триггера БД TestConnect, заносящего в таблицу UsersConnect имена пользователей, подключающихся к учебной БД, а также дату и время подключения. Скрипт будет выглядеть следующим образом:

CREATE TABLE Users Connect

(User Name VARCHAR(20), Date Time TIMESTAMP);

SET TERM !! ;

CREATE TRIGGER Test Connect

ACTIVE

ON CONNECT

BEGIN

INSERT INTO Users Connect



VALUES (USER, CURRENT TIMESTAMP); END!!

SET TERM ; !! COMMIT;.

В результате выполнения данного скрипта при каждом подключении к учебной БД в таблицу UsersConnect будут занесены имя подключающегося пользователя и дата/время на момент подключения.

Аналогично описанной ранее модификации триггеров DML может быть выполнено изменение активности или изменение тела ранее созданного триггера БД. Однако следует учесть, что событие, с которым ассоциирован триггер БД, не может быть изменено.

6.4. Выполняемые блоки

Как уже отмечалось, существует возможность выполнения кода на PSQL без оформления именованных ХП или триггеров. Такую возможность предоставляет запрос EXECUTE BLOCK, который имеет следующий синтаксис:

EXECUTE BLOCK [(входной параметр1 <тип цанных> = : входной параметр1

[, входной параметр2 <тип данных> = : входной параметр2])] RETURNS (выходной параметр1 <тип данных>

выходной параметр2 <тип цанных> AS <тело блока>.

Данный оператор может использоваться в клиентских приложениях для реализации требуемой логики работы системы, когда в используемой базе данных нет необходимой именованной ХП или триггера. Входные параметры в таком случае передаются в оператор EXECUTE BLOCK из приложения, а выходные - возвращаются клиентскому приложению. В IBExpert данный оператор можно выполнить в SQL-редакторе как обычный запрос.

В операторе EXECUTE BLOCK <тело блока> может включать в себя все те же конструкции (операторы, запросы), что и тело хранимой процедуры или триггера.

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

EXECUTE BLOCK (TextField VARCHAR(50)=:TextField,

TableName VARCHAR(50)=:TableName) RETURNS (Line VARCHAR(10000))

DECLARE VARIABLE OneLine VARCHAR(50); BEGIN



1 ... 82 83 84 [ 85 ] 86 87 88 ... 101

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