Разработка приложений баз данных для СУБД Sybase SQL Anywhere



       

Назначение псевдонимов, вводимых фразой


REFERENCING для обращения к исходным и обновленным записям при определении триггеров

Тип триггераПараметр для REFERENCINGОператоры, активизирующие триггерINSERTDELETEUPDATE

СтрочныйПредваряющийNEW ASДля обращения к полям вводимой записи--Для обращения к новым значениям модифицируемых полей записи
OLD AS--Для обращения к полям удаляемой записиДля обращения к исходным значениям модифицируемых полей записи
ЗавершающийNEW ASДля обращения к полям введенной записи--Для обращения к новым значениям модифицируемых полей записи
OLD AS--Для обращения к полям удаленной записиДля обращения к исходным значениям модифицируемых полей записи
ОператорныйЗавершающийNEW ASДля обращения к времненой таблице, содержащей введенные записи--Для обращения к временной таблице,содержащей модифицированные записи
OLD AS--Для обращения к временной таблице, содержащей удаленные записиДля обращения к временной таблице, содержащей исходные значения обновленных записей

    ПРИМЕЧАНИЕ

    При активизации операторного триггера создаются одна или две временные таблицы. В этих таблицах хранятся записи, добавленные к исходной таблицы данных, удаленные из нее или записи, подвергнувшиеся изменениям, до и после выполнения оператора UPDATE.



    Для завершения обсуждения псевдонимов, используемых в триггерах, приведем еще один пример триггера:

    //Демонстрация псевдонимов триггера CREATE TRIGGER Update_Number /* Строчный завершающий триггер, выдающий при модификации поля Number старое и новое его значения */ AFTER UPDATE OF Number ON Stepanov.Books REFERENCING OLD AS Old_books NEW AS New_books FOR EACH ROW BEGIN MESSAGE '*** UPDATE ****'; MESSAGE 'OLD NUMBER=', Old_books.number; MESSAGE 'NEW NUMBER=', New_books.number; END

    Строчный завершающий триггер Update_Number, активизируется при модификации поля Stepanov.Books.Number. В процессе своей работы он выдает на сервер старое и новое значение этого поля. Для проверки его работы выполним следующей SQL-оператор:

    //Проверка триггера Update_Number UPDATE Stepanov.Books SET Number=7 WHERE Code_book=1




    В результате в окне сервера будет выдано следующее сообщение:
    *** UPDATE **** OLD NUMBER=49 NEW NUMBER=7
    После этого выполним оператор ROLLBACK для отмены проведенной модификации таблицы Stepanov.Books.
    Рассмотрим теперь пример операторного триггера. Определим его снова для таблицы Stepanov.Books и опять для события Добавление новой записи. Для данной таблицы на это событие уже настроен один триггер - Add_copies. Поэтому для задания очередности выполнения триггеров установим, чтобы новый триггер запускался во вторую очередь (фраза ORDER 2). В данном случае иначе и нельзя, так как триггер Add_copies - это предваряющий триггер, а новый триггер - завершающий. Назовем новый триггер Copies_Books. Текст его представлен ниже:
    // Создание операторного триггера CREATE TRIGGER Copies_Books AFTER INSERT ORDER 2 ON Stepanov.Books FOR EACH STATEMENT /* Операторный завершающий триггер сранивает число экземпляров книг зафиксированных в таблицах Stepanov.Books и Stepanov.Copies. Если эти данные не совпадают, то значит нарушена целостность данных. В этом случае искусственно генерируется ошибка с кодом SQLSTATE '99999' */ BEGIN DECLARE Err_referencins EXCEPTION FOR SQLSTATE '99999'; DECLARE Count_copies SMALLINT; DECLARE Sum_copies SMALLINT; //Определяем число книг в библиотеке, //используя таблицу Stepanov.Copies SELECT COUNT(*) INTO Count_copies FROM Stepanov.Copies; //Определяем число книг в библиотеке, //используя таблицу Stepanov.Books SELECT SUM(Books.Number) INTO Sum_copies FROM Stepanov.Books; //Сравниваем результаты подсчетов IF Count_copies <> Sum_copies THEN MESSAGE 'Err_referencins'; SIGNAL Err_referencins; END IF; END
    В данном триггере нет обращений отдельно к вновь введенным записям таблицы Stepanov.Books, обращение происходит целиком к таблице. По этой причине фраза REFERENCING в триггере не используется. Рассматриваемый триггер представляет собой еще один пример механизма поддержания сложных форм ограничений целостности данных. Оба триггера взаимно дополняют друг друга. Предваряющий строчный триггер Add_copies согласованно добавляет записи в таблицы Stepanov.Copies и Stepanov.Books. Завершающий операторный триггер Copies_Books проверяет согласованность содержимого этих таблиц.
    Действия, реализуемые в этом триггере и в триггере Add_copies, не могут быть реализованы стандартными механизмами поддержания ссылочной целостности. Это является наглядным примером того какое мощное средство поддержания целостности данных представляют собой триггеры.
    По аналогии с ранее рассмотренными программными объектами - хранимыми процедурами и функциями, любой триггер содержится в базе данных. Там он хранится до тех пор пока не будет удален из нее посредством оператора DROP TRIGGER. Таким образом для удаления триггера Add_copies этот оператор должен быть использован так:


    //Удаление триггера DROP TRIGGER Add_copies.
    Триггеры всегда выполняются с полномочиями владельца таблицы, с которой связаны триггеры. Привилегии пользователя, активизировавшего триггер, или пользователя, создавшего триггер, на выполнение самого триггера не оказывают никакого влияния. Допустим, что библиотекари не имеют вообще никаких привилегий на использование таблиц Stepanov.Copies и Stepanov.Books. Однако они имеют право вызывать процедуру Ins_absent, которая осуществляет пополнение состава записей таблицы Stepanov.Books. Тогда библиотекари при обращении к процедуре Ins_absent, добавляющей новые записи в таблицу Stepanov.Books, активизируется триггер Add_copies. Этот триггер выполняется с привилегиями пользователя Stepanov. - владельца таблицы Stepanov.Copies. Следовательно этот триггер имеет возможность вводить новые записи в эту таблицу. В связи с этим библиотекари, не имея право работать с таблицей Stepanov.Copies-напрямую, тем не менее имеют возможность взаимодействовать с этой таблицей косвенно. Данное свойство позволяет разработать для пользователей единый способ манипулирования с конкретной таблицей, что служит еще одним средством поддержания целостности данных.
    Таким образом, исходя из сказанного, следует, что триггеры являются мощным средством обеспечения сложных форм ограничений целостности данных.

    Содержание раздела