--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
/