Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Bonik / DIP / Приложение А

.doc
Скачиваний:
18
Добавлен:
16.04.2013
Размер:
40.96 Кб
Скачать

--Created: 30.05.99

--Author : Тарабрин Б.К.

--Theme: Набор тригеров на таблицу sisbrlparval

CREATE OR REPLACE PACKAGE dtasisbrlparval AS

/*

Пакет содержит структуры, процедуры и функции, необходимые

для работы тригеров на таблицу sisbrlparval.

В настоящий момент проводится:

1) проводится контроль параметра "Login Name" на уникальность

и перевод его значения в верхний регистр;

2) автоматическое заполнение поля pksisbrlparval.

*/

--=============Описание констант====================

-- Код типового параметра "Login name"

LogNameCode CONSTANT sisbrlparval.pksstppar%TYPE := 161;

--=============Конец описания констант====================

--=============Описание типов====================

-- Тип для сохранения информации о значении параметра "Login name"

TYPE T_LogNameRec IS RECORD

(

LogName sisbrlparval.cvalue%TYPE,

ParValCode sisbrlparval.pksisbrlparval%TYPE

);

-- Масссив типа T_LogNameRec

TYPE T_LogNameList IS TABLE OF T_LogNameRec INDEX BY BINARY_INTEGER;

--=============Конец описания типов====================

--=============Описание переменных====================

v_LogName T_LogNameList;

-- Индекс массива v_LogName

nIdx BINARY_INTEGER DEFAULT 0;

--=============Конец описания переменных====================

--=============Описание функций и процедур====================

FUNCTION CheckAllLogNames RETURN BOOLEAN

/*

Функция проводит проверку всех записанных в массив v_LogName значений параметра "Login name".

Если все значения уникальны, то возвращается TRUE, иначе FALSE. По окончании работы массив v_LogName

обнуляется.

*/

;

FUNCTION CheckLogName (LogNameRec T_LogNameRec) RETURN BOOLEAN

/*

Функция проводит проверку значения параметра "Login name", переданного в структуре типа T_LogNameRec.

Если значение уникально, то возвращается TRUE, иначе FALSE.

*/

;

--=============Конец описания функций и процедур====================

END dtasisbrlparval;

/

show errors

/

CREATE OR REPLACE PACKAGE BODY dtasisbrlparval AS

FUNCTION CheckAllLogNames RETURN BOOLEAN IS

BEGIN

--Проверяем все значения массива

WHILE nIdx > 0 LOOP

--Вызываем для каждого элемента CheckLogName

IF CheckLogName (v_LogName (nIdx)) = FALSE THEN

--Уничтожаем массив

v_LogName.DELETE;

nIdx := 0;

-- Все плохо

RETURN FALSE;

END IF;

nIdx := nIdx -1;

END LOOP;

--Уничтожаем массив

v_LogName.DELETE;

-- Все хорошо

RETURN TRUE;

END CheckAllLogNames;

FUNCTION CheckLogName (LogNameRec T_LogNameRec) RETURN BOOLEAN IS

n_Dummy sisbrlparval.pksisbrlparval%TYPE;

BEGIN

--Запрашиваем таблицу sisbrlparval на предмет неуникальных значений параметра

SELECT pksisbrlparval

INTO n_Dummy

FROM sisbrlparval

WHERE pksstppar = LogNameCode AND cvalue = LogNameRec.LogName AND pksisbrlparval != LogNameRec.ParValCode;

-- Если значение найдено, значит проверямый параметр НЕ уникален, все полохо. Это значит, что параметр уже существует

RETURN FALSE;

EXCEPTION

WHEN NO_DATA_FOUND THEN

-- Если значений не было найдено, значит проверямый параметр уникален, все хорошо

RETURN TRUE;

WHEN TOO_MANY_ROWS THEN

-- Если значений слишком много, значит проверямый параметр НЕ уникален, все полохо. Это значит, что данные были вставлены в

-- обход триггеров

RETURN FALSE;

END CheckLogName;

END dtasisbrlparval;

/

show errors

/

CREATE OR REPLACE TRIGGER ibr_sisbrlparval

BEFORE INSERT ON sisbrlparval FOR EACH ROW

BEGIN

/*

Тригер автоматически заполняет поле pksisbrlparval.

Затем следует анализ вставленной строки, если вставлется параметр "Login Name",

то все значения запоминаются в специальной структуре пакета dtasisbrlparval, значение

переводится в верхний регистр.

*/

-- заполняем поле pksisbrlparval

SELECT sq_pk_SBPARVAL.NEXTVAL

INTO :new.pksisbrlparval

FROM DUAL;

--если вставлется параметр "Login Name"

IF (:new.pksstppar = dtasisbrlparval.LogNameCode) THEN

--переводим в верхний регистр

:new.cvalue := UPPER (:new.cvalue);

-- заполняем структуру значениями для последующего анализа

dtasisbrlparval.nIdx := dtasisbrlparval.nIdx + 1;

dtasisbrlparval.v_LogName(dtasisbrlparval.nIdx).LogName := :new.cvalue;

dtasisbrlparval.v_LogName(dtasisbrlparval.nIdx).ParValCode := :new.pksisbrlparval;

END IF;

END ibr_sisbrlparval;

/

show errors

/

CREATE OR REPLACE TRIGGER ia_sisbrlparval

AFTER INSERT ON sisbrlparval

BEGIN

/*

Тригер анализирует значения параметра "Login name". Если вставляемые значения неуникальны,

то возникает исключительная ситуация DUP_VAL_ON_INDEX (нарушение уникальности)

*/

IF (dtasisbrlparval.nIdx > 0) THEN

IF dtasisbrlparval.CheckAllLogNames = FALSE THEN

RAISE DUP_VAL_ON_INDEX;

END IF;

END IF;

END ia_sisbrlparval;

/

show errors

/

CREATE OR REPLACE TRIGGER ubr_sisbrlparval

BEFORE UPDATE ON sisbrlparval FOR EACH ROW

BEGIN

/*

Тригер преобразует значение параметра "Login Name" к верхнему регистру,

затем все значения запоминаются в специальной структуре пакета dtasisbrlparval.

*/

IF (:new.pksstppar = dtasisbrlparval.LogNameCode) THEN

:new.cvalue := UPPER (:new.cvalue);

dtasisbrlparval.nIdx := dtasisbrlparval.nIdx + 1;

dtasisbrlparval.v_LogName(dtasisbrlparval.nIdx).LogName := :new.cvalue;

dtasisbrlparval.v_LogName(dtasisbrlparval.nIdx).ParValCode := :new.pksisbrlparval;

END IF;

END ubr_sisbrlparval;

/

show errors

/

CREATE OR REPLACE TRIGGER ua_sisbrlparval

AFTER UPDATE ON sisbrlparval

BEGIN

/*

Тригер анализирует значения параметра "Login name". Если вставляемые значения неуникальны,

то возникает исключительная ситуация DUP_VAL_ON_INDEX (нарушение уникальности)

*/

IF (dtasisbrlparval.nIdx > 0) THEN

IF dtasisbrlparval.CheckAllLogNames = FALSE THEN

RAISE DUP_VAL_ON_INDEX;

END IF;

END IF;

END ua_sisbrlparval;

/

show errors

/

-- Работа с сессиями

CREATE OR REPLACE PACKAGE dtaisessionact as

-- структура данных для сохранения изменяемых и удаляемых данных таблицы kernel.isessionact

TYPE t_PkIsessionact IS TABLE OF isessionact.pkisessionact%TYPE INDEX BY BINARY_INTEGER;

TYPE t_DstartSes IS TABLE OF isessionact.dstartses%TYPE INDEX BY BINARY_INTEGER;

TYPE t_PkSiSbRlParVal IS TABLE OF isessionact.pksisbrlparval%TYPE INDEX BY BINARY_INTEGER;

TYPE t_NcdTpUsr IS TABLE OF isessionact.ncdtpusr%TYPE INDEX BY BINARY_INTEGER;

TYPE t_DLastActive IS TABLE OF isessionact.dlastactive%TYPE INDEX BY BINARY_INTEGER;

TYPE t_CIpAddress IS TABLE OF isessionact.cipaddress%TYPE INDEX BY BINARY_INTEGER;

v_pkisessionact t_PkIsessionact;

v_dstartses t_DstartSes;

v_pksisbrlparval t_PkSiSbRlParVal;

v_ncdtpusr t_NcdTpUsr;

v_dlastactive t_DLastActive;

v_cipaddress t_CIpAddress;

-- конец описания структуры

-- количество элементов в работе

n_Idx BINARY_INTEGER := 0;

-- ==================================================================================

-- Процедуры

-- Вставка удаляемых данных в таблицу kernel.isessionarc

procedure InsertLog;

-- конец процедур

END dtaisessionact;

/

show errors

/

CREATE OR REPLACE PACKAGE BODY dtaisessionact as

-- Вставка удаляемых данных в таблицу kernel.isessionarc

PROCEDURE InsertLog is

BEGIN

FOR n_LoopIdx IN 1..n_Idx LOOP

INSERT INTO isessionarc

(pkisessionact, dstartses, pksisbrlparval, ncdtpusr, dlastactive, cipaddress, dkilled)

VALUES

(v_pkisessionact(n_LoopIdx), v_dstartses(n_LoopIdx), v_pksisbrlparval(n_LoopIdx), v_ncdtpusr(n_LoopIdx), v_dlastactive(n_LoopIdx), v_cipaddress(n_LoopIdx), SYSDATE);

END LOOP;

n_Idx := 0;

END InsertLog;

END dtaisessionact;

/

show errors

/

CREATE OR REPLACE TRIGGER dbr_isessionact

BEFORE DELETE ON isessionact FOR EACH ROW

BEGIN

-- сохранение удаляемой строки в структуре пакета dtaisessionact

dtaisessionact.n_Idx := dtaisessionact.n_Idx + 1;

dtaisessionact.v_pkisessionact(dtaisessionact.n_Idx) := :old.pkisessionact;

dtaisessionact.v_dstartses(dtaisessionact.n_Idx) := :old.dstartses;

dtaisessionact.v_pksisbrlparval(dtaisessionact.n_Idx) := :old.pksisbrlparval;

dtaisessionact.v_ncdtpusr(dtaisessionact.n_Idx) := :old.ncdtpusr;

dtaisessionact.v_dlastactive(dtaisessionact.n_Idx) := :old.dlastactive;

dtaisessionact.v_cipaddress(dtaisessionact.n_Idx) := :old.cipaddress;

END;

/

show errors

/

CREATE OR REPLACE TRIGGER da_isessionact

AFTER DELETE ON isessionact

BEGIN

-- сохранение удаленных данных в таблице isessionarc

dtaisessionact.InsertLog;

END;

/

show errors

/

Соседние файлы в папке DIP