Лабораторная работа №4. 1. Создание и использование триггеров Цель работы. Приобрести навыки по созданию и использованию триггеров в СУБД. Сведения. Механизм триггеров позволяет программировать обработку ситуаций, возникающих при любых изменениях (определенных в триггере) в базе данных. Триггер создается для таблицы базы данных и активируется при выполнении над таблицей операций добавления, удаления или обновления строк. СУБД регистрирует событие изменения состояния таблицы и передает его соответствующему триггеру, который выполняет SQL-операторы, определенные внутри триггера, либо производит вызов хранимой процедуры. Триггер хранится в базе данных наряду с таблицами, представлениями, хранимыми процедурами. При создании триггера необходимо определить следующие данные: имя триггера, условия включения триггера, полного имени столбца таблицы, перечень строк над которыми выполняется действие. CREATE TRIGGER имя триггера [DELETE|INSERT |UPDATE [OF имя столбца табл]] ON имя_табл [REFERENCING {OLD|NEW} AS алиас_записи ] [BEFORE] [FOR EACH ROW] [WHEN (условие) (действие)] ]| [WHEN (условие) (действие)] [AFTER] [FOR EACH ROW] [WHEN (условие) (действие)]] ] [DISABLED|ENABLED] где условие может содержать элемент записи OLD или NEW детализированный до имени столбца таблицы; действие – SQL –оператор INSERT,DELETE,UPDATE, EXECUTE PROCEDURE Замечание. При формулировании заданий были сделаны следующие предположения: пользователь Informix создал базу данных BASE и имеет права DBA. В базе данных есть таблицы Table1 Table2 с полями pole1, pole2 , pole3 , pole4 и в таблице имеется несколько записей (создать таблицу с помощью команд CREATE TABLE, и наполнить значения с помощью оператора INSERT). Имеется хранимая процедура updTable2(param1,param2), которая обновляет значение поля pole1 передаваемое значение param1 для всех строк у которых pole2 совпадает с param2 (см. лабораторная работа «Создание и использование хранимых процедур»). Порядок выполнения работы: Задание 1. 1. Запустить утилиту Informix dbaccess. 2. Установить соединение с базой данных, созданной студентом на сервере ol_serv3. 3. Выбрать пункт “Query Language”. 4. В поле запроса набрать команду создающую триггер на вставку нового значения в таблицу Table1 CREATE TRIGGER check_insert INSERT ON Table1 REFERENCING NEW AS new_record FOR EACH ROW (EXECUTE PROCEDURE updTable2(new_record,pole1,new_record.pole2)); После набора текста процедуры выполнить команду RUN 5. Если все команды в тексте набраны без ошибок, будет выдано сообщение trigger created Выполнить SQL оператор вставки строк: 6. INSERT INTO table1 (pole1,pole2, pole3) VALUES (1,2,3); 7. Проверить SQL запросом содержимого таблицы table2. Задание 2. Создать триггер, активирующийся на обновление таблицы Table2 по столбцу pole3 CREATE TRIGGER check_update UPDATE OF pole3 ON Table2 REFERENCING OLD AS old_record NEW AS new_record FOR EACH ROW (INSERT INTO table1(pole1,pole2) VALUES (new_record.pole3),old_record.pole2 ); Выполнить команду UPDATE Table1 SET pole3=’Проверка триггера обновления’ WHERE pole2=1; Задание 3. Создание триггера запускаемое один раз на удаление строк из таблицы независимо от количества удаляемых строк. 1. Набрать команду создания триггера выполняемого один раз, добавляющего единицу в таблицу содержащую строку с количеством удаленных строк CREATE TRIGGER check_delete DELETE ON Table2 AFTER (UPDATE table1 SET pole4=pole4+1 ); 2. Выполнить команду удаления из таблицы Table2 DELETE FROM table2 WHERE pole2=4; 3. Выполнить SQL – оператор показывающий содержимое таблицы table1 Задание 4. Изменить состояния триггеров в неактивное состояние выполнить команду. Затем выполнить проверочные пункты заданий 1-3 и проанализировать результат SET TRIGGERS check_insert, check_update, check_delete DISABLED Задание 5. Удалить триггера check_insert, check_update, check_delete DROP TRIGGER check_insert ; DROP TRIGGER check_update ; DROP TRIGGER check_delete ; Затем выполнить проверочные пункты заданий 1-3 и проанализировать результат 2. Создание и использование хранимых процедур Цель работы. Приобрести навыки по созданию и использованию хранимых процедур на языке SPL (Stored Procedure Language). Сведения.Informix Dynamic Server.2000 и выше, поддерживает создание хранимых процедур и функций на собственном языке, который так и называется — Stored Procedure Language (SPL). Этот язык поддерживает основные конструкции, присущие языкам структурного программирования: IF, FOR, WHILE и т.п., а также имеет интеграцию с SQL-операторами, которые вписываются в конструкции SPL. Определение переменных: DEFINE имя_переменной ТИП ПЕРЕМЕННОЙ (int, char, date) Оператор присвоения значений: LET имя переменной = значение Операторы ветвления IF <условие> THEN <[SQL оператор;]> [ELSE <[SQL оператор;]> [ELSIF <[SQL оператор;]>] ] END IF Вызов процедуры в процедуре: CALL имя_процедуры(список параметров) [RETURNING список возвращаемых значений] Замечание. При формулировании заданий были сделаны следующие предположения: пользователь Informix создал базу данных BASE и имеет права DBA. В базе данных есть таблица Table2 с полями pole1, pole2 , и в таблице имеется несколько записей (создать таблицу с помощью команд CREATE TABLE, и наполнить значения с помощью оператора INSERT ). Порядок выполнения работы: Задание 1. 8. Запустить утилиту Informix dbaccess. 9. Установить соединение с базой данных, созданной студентом на сервере ol_serv3. 10. Выбрать пункт меню QUERY LANGUAGE. 11. В поле запроса набрать команду CREATE PROCEDURE inc(mode integer) RETURNING integer; DEFINE GLOBAL i INTEGER DEFAULT 0; IF mode=0 THEN LET i=0; ELSE LET i=i+1; END IF; RETURN i; END PROCEDURE; После набора текста процедуры выполнить команду RUN 12. Если все команды в тексте набраны без ошибок, будет выдано сообщение procedure created 13. Выполнить запрос c использованием процедуры inc. Например, запрос: SELECT inc(1) as num, pole1 FROM table1 14. Dbaccess выдаст результат в виде строки последовательно увеличивающегося поля num и поля pole1 из таблицы table1. 15. Запуск этого запроса повторно выдаст также последовательные номера, но продолжая нумерацию после последнего запроса п.9 16. Чтобы снова начать нумерацию с 0 необходимо выполнить запрос с параметром 0. Задание 2. Создать процедуру обновляющие данные таблицы table2 устанавливающего в соответствие значение из переменной pname в pole1 по полю pole2 и CREATE PROCEDURE updTable2(pname char(20) , pCode integer) DEFINE pname integer; DEFINE i integer; LET i=0; FOREACH select pole1 into pname from Table1 where pole2=pCode order by pole1 LET i=i+1; UPDATE table2 set pole1=pname where pole2=pCode; END FOREACH; END PROCEDURE; Выполнить команду EXECUTE PROCEDURE updTable2(‘Новое значение’,1); Выполнить SQL - оператор показывающий содержимое таблицы table1, table2. Задание 3. Разграничение доступа с помощью хранимых процедур Для выполнения задания необходимо у таблицы table1 для пользователя STUD1 отменить отобрать привилегии UPDATE и DELETE. Отменить привилегию UPDATE пользователю STUD1. 3. Перейти к сессии пользователя Informix и в ней выбрать какую-либо таблицу. Отобрать привилегию UPDATE на выбранные столбцы таблицы Table1 у пользователя STUD1: REVOKE UPDATE ON table1 FROM STUD1 4. Перейти к сессии пользователя Informix. Дать привилегию исполнения запроса EXECUTE на процедуру обновляющую данные пользователю STUD1: GRANT EXECUTE ON updTable2 TO STUD1 3. Перейти к сессии STUD1 и попытаться исполнить оператор UPDATE по выбранной таблице Table1 и убедиться что прав на изменение таблицы отсутствуют и выдается сообщение об ошибке. UPDATE table1 SET pole1=0 5. Выполнить команду EXECUTE PROCEDURE по выбранной таблице пользователем STUD1 и убедиться с помощью команды SELECT, что значение строки со значением pole2=5 изменилось на значение «Новое значение». EXECUTE PROCEDURE updTable2(‘новое значение’ ,5’); Задание 4. Удалить процедуру updTable2, и процедуру inc c помощью команды DROP PROCEDURE имя_процедуры. DROP PROCEDURE inc; DROP PROCEDURE updTable2;