Курсовая работа: Особенности разработки триггеров и хранимых процедур в СУБД
WHERE (((оклады.[код оклада]) Is Null));
'данные' без подчиненных в
'оклады' |
фамилия |
имя |
отчество |
образование |
СИДОРЧУК |
Валентина |
Викторовна |
|
4. Триггеры
Триггер - это особый вид хранимой процедуры, которая
выполняется автоматически при вставке, удалении или модификации записи таблицы
или вьюера. Триггеры никогда не вызываются напрямую, а только при модификации
таблиц или вьюеров и могут "срабатывать" непосредственно до или сразу
же после указанного события.
Существует три основных SQL-операции, применимые к данным, -
INSERT/DELETE/UPDATE. А поскольку срабатывание триггера может происходить
"до" (BEFORE)и
"после"(AFTER) операции, то получается шесть возможных видов триггеров на таблицу - до
и после каждой из трех возможных SQL-операций.
Триггер может быть активный (ACTIVE) и неактивный (INACTIVE).
·
Польза от
применения триггеров.
- Принудительная обработка ограничений, что позволяет пользователю
быть уверенным, что он вводит в строки только достоверные данные.
- Изменения в триггере автоматически отображаются у всех
приложений, связанных с таблицей, что не требует их перекомпиляции, так как все
происходит в базе данных, а не у каждого приложения в отдельности.
- Автоматическая регистрация изменений в таблицах. Приложение
может регистрировать с помощью триггера изменения в таблице.
- Автоматическая регистрация изменений в базе данных с
помощью обработчиков событий в триггерах.
·
Примеры
триггеров.
Триггер (англ. trigger
«собачка, защёлка, спусковой крючок»):
в русском языке первоначально — термин из области радиосхем,
позже электронной техники: пусковая схема, схема с несколькими устойчивыми
состояниями, см. триггер (электроника); в последнее время заимствовались и
другие значения английского оригинала:
спусковой крючок пистолета, арбалета и т. п., кнопка на
джойстике, находящаяся под указательным пальцем; в более широком смысле: некая
причина возникновения события вообще условия, при наступлении которых должно
происходить предписанное действие Триггеры являются особой разновидностью
хранимых процедур, которые активизируются не по прямому вызову пользователя, а
при наступлении определенного события в базе данных, а именно — вставки,
удаления или модификации записи в таблице. Триггеры привязаны к конкретной
таблице. Каждая таблица может иметь до трех триггеров — по одному на каждый вид
операции с данными (INSERT, UPDATE, DELETE). Но один триггер может также
обрабатывать и два и все три события.
Триггер может быть использован для соблюдения определенных
правил модификации данных. При нарушении этих правил он может откатить все
произведенные изменения и вернуть данные в исходное состояние. Кроме того,
триггер может быть использован для автоматического осуществления каких-либо
сопутствующих операций, например ведения журнала изменений данных или автоматического
обновления некоторых итоговых значений (например, значения поля, в которое
вносится количество сотрудников в фирме).
Триггер срабатывает после удаления строки из таблицы DAN и
записывает удаленную строку в таблицу UD_DAN.
SET TERM^;
CREATE TRIGGER CHRAN_UD_DAN FOR DAN
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
INSERT INTO UD_DAN
VALUES(OLD.TAB_NO,OLD.FAM,OLD.IMIA,OLD.OTSH,OLD.G_R,OLD.ADRES,OLD.TEL,OLD.DATA_P,OLD.DATA_U,
OLD.OBRAZ,OLD.SEM_POLOJ, OLD.S_N_PASPORT, OLD.K_V, OLD.K_O, OLD.K_P);
END^
SET TERM;^
Теперь если выполнить команду
DELETE FROM DAN
WHERE TAB_NO=1014; // (и 1013)
произойдёт конечно удаление строки из таблицы DAN, сработает
триггер и удаленная строка запишется в таблицу UD_DAN, которая собственно и
предназначена для хранения удаленных данных.
Что бы отключить триггер следует выполнить команду
ALTER TRIGGER <имя триггера> INACTIVE;
Что бы включить триггер следует выполнить команду
ALTER TRIGGER <имя триггера> ACTIVE;
Что бы удалить триггер команда
DROP TRIGGER <имя триггера>;
Следующий триггер, срабатывает ДО ВСТАВКИ (BEFORE INSERT) в таблицу DAN и заполняет поле первичного ключа (TAB_NO).
SET TERM ^;
CREATE TRIGGER VS_T FOR DAN
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.TAB_NO IS NULL) THEN
NEW.TAB_NO=GEN_ID (TAB, 1);
END ^
SET TERM; ^
Для этого триггера потребуется генератор с начальным
значением 1012, так как это максимальный табельный номер уже заполненной
таблицы DAN и, новым сотрудникам, вносимым в
таблицу, будут присвоены табельные номера, следующие за 1012.
CREATE GENERATOR TAB;
SET GENERATOR TAB TO 1012;
При вставки новой строки в таблицу DAN, даже не указав значение поля TAB_NO,
INSERT
INTO DAN (FAM, IMIA, OTSH, G_R, ADRES, TEL,
DATA_P, DATA_U, OBRAZ,
SEM_POLOJ,
S_N_PASPORT, K_V, K_O, K_P)
VALUES ('Кротов', 'Андрей', 'Федорович',
'12.08.1961', 'Кирова 52-124', '281344', '21.02.2008',
'28.03.2008','среднее''холост', '9999 22', '900' , '50' , '1');
То есть триггер перед вставкой произвел проверку, указал ли
пользователь значение поля TAB_NO, и не обнаружив такового,
воспользовался генератором, увеличив его значение на 1, занес полученное в поле
TAB_NO нового сотрудника.
Генератор, в свою очередь, теперь хранит значение 1014.
Кроме контекстной переменной NEW, существует переменная OLD.
В отличие от NEW, OLD содержит старые значения записи, которые удаляются или изменяются.
Например, можно использовать переменную OLD для получения значений записей,
которые удаляются из таблицы.
Следующий триггер срабатывает ПОСЛЕ УДАЛЕНИЯ (AFTER
DELETE) и записывает строки, удаленные из таблицы в отдельную таблицу.
Сначала необходимо создать таблицу для хранения удаленных
данных.
CREATE TABLE DAN_D
(TAB_NO_D Float,
FAM_D Varchar (20),
IMIA _D Varchar (20),
OTSH_D Varchar (20),
G_R_D Date,
ADRES_D Varchar (20),
TEL_D Char (6) );
SET TERM ^;
CREATE TRIGGER DEL_DAN FOR DAN
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
INSERT INTO DAN_D
VALUES (OLD.TAB_NO, OLD.FAMILIA, OLD. IMIA E,
OLD.OTSHO, OLD.GOD_R,
OLD.ADRES,
OLD.TEL);
END ^
SET TERM; ^
Как только происходит удаление строки из таблицы DANNIE,
DELETE FROM DANNIE
WHERE TAB_NO=1013;
Так как, в данной БД при удалении строки из таблицы DAN удаляется и строка из таблицы NASH (начисления) с идентичным табельным
номером (TAB_NO), уместно было бы создать триггер, который сохранял бы и данные
из таблицы NASH. Чтобы не создавать лишние таблицы
для хранения удаленных данных можно расширить уже созданную таблицу DAN_D.
ALTER TABLE DAN_D ALL KOD_Z_D FLOAT;
ALTER TABLE DAN_D ALL KOD_D_D FLOAT;
ALTER TABLE DAN_D ALL KOD_V_D FLOAT;
ALTER TABLE DAN_D ALL SLOJ_D
FLOAT;
ALTER TABLE DAN_D ALL PAIK_D
FLOAT;
Следующий триггер срабатывает после удаления строки из
таблицы NASH.
SET TERM ^;
CREATE TRIGGER DEL_NASH FOR NASH
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
UPDATE DAN_D
SET KOD_Z_D=OLD.KOD_Z, KOD_D_D=OLD.KOD_D,
KOD_V_D=OLD.KOD_V, SLOJ_D=OLD.SLOJ,
PAIK_D=OLD.PAIK
WHERE TAB_NO_D=OLD.TAB_NO;
END ^
SET TERM; ^
Теперь после команды
DELETE FROM DAN
WHERE TAB_NO=1012;
произойдет следующее:
1.
Произойдет
удаление строки с TAB_NO=1014 из таблицы DAN.
2.
Сработает триггер
DEL_DAN, который запишет удаленную строку в таблицу DAN_D.
Страницы: 1, 2, 3, 4, 5, 6 |