1. Создание и использование триггеров

advertisement
Лабораторная работа №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;
Download