|
Программирование >> Проектирование баз данных
CURSOR c payroll IS SELECT pay.dept FROM payroll pay WHERE id = p emp id; BEGIN OPEN c payroll ; FETCH c payroll INTO dept; CLOSE c payroll; IF dept <> my dept THEN RETURN FALSE; END IF; RETURN TRUE; END checkdept; PROCEDURE del (p emp id INTEGER) IS - Удалять сотрудников могут только начальники их отделов - Записи таблицы Payroll BEGIN IF checkdept(p emp id) AND mgr THEN DELETE payroll WHERE id = p emp id; ELSE raise application error (-20001, Insufficient Privilege); END IF; END del; PROCEDURE ins (p emp id INTEGER, p name VARCHAR2 ,p-dept INTEGER, p payment period VARCHAR2 ,p salary INTEGER) IS - Можете вставлять записи Payroll только в свой отдел - Устанавливать зарплату может только начальник отдела (в противном случае устанавливается в пустое значение) l salary payroll.salary%TYPE; BEGIN IF NOT checkdept(p emp id) THEN raise application error (-20001, Insufficient Privilege); END IF; IF NOT mgr THEN l salary := NULL; ELSE l salary := p salary; END IF; INSERT INTO payroll (id,name,dept,payment period, salary) VALUES (p emp id,p name,p dept,p payraent period,l salary); END ins; PROCEDURE upd (p emp id INTEGER, p name VARCHAR2 ,p payment period VARCHAR2 ,p salary INTEGER) IS ~ Можете обновлять записи Payroll только в своем отделе ~ Обновлять зарплату может только начальник отдела (в противном случае остается без изменений) ~ Отдел изменять нельзя 1 salary payroll.salary%TYPE; CURSOR c old 3alary IS SELECT pay.salary FROM payroll pay WHERE id = p erap id; BEGIN IF NOT checkdept (p emp id) THEN raise applicatiori error (-20001, Insufficient Privilege); END IF; IF NOT mgr THEN OPEN c old salary; FETCH c old 3alary INTO l salary; CLOSE c old 3alary; ELSE 1 за1агу := р за1агу; END IF; UPDATE payroll SET name = p name ,payment period = p payment period ,salary = l salary WHERE Id = p emp id; END upd; -Код инициализации пакета BEGIN OPEN c me; FETCH c me INTO ray dept ,mgr flag; CLOSE c me; IF mgr flag = Y THEN mgr := TRUE; ELSE mgr := FALSE ; END IF; IND k payroll; / Использование триггеров Несмотря на преимущества инкапсуляции, рещение, приведенное в тредыдущем разделе, не идеально, поскольку код очень привязан к таб-тице PAYROLL. Это означает, что при изменении структуры PAYROLL мы юлжны корректировать пакет. Кроме того, мы еще не касались самого хитрого вопроса - поддержки запросов с помощью данного пакета. По :ути, функциональные возможности, предоставляемые этим пакетом, гораз-10 легче реализовать в виде триггеров - их применение позволяет уменьшить злияние изменений в структуре таблицы. Очевидное достоинство пакета состоит в том, что мы можем хранить гнформацию о пользователе (его отделе и о том, начальник ли он) в глобальных переменных, а не запрашивать ее каждый раз. Однако мы можем обратиться к пакету из триггеров и таким образом добиться тех же преимуществ. Однако действительное преимущество триггеров в данном случае (при условии, что они включены) заключается в том, что их действие неотвратимо, и это заставляет всех играть по одним правилам. Вспомните, ведь мы говорим о безопасности данных, а не о безопасности доступа, поэтому должны применять процедурные правила к данным. А для этого необходимы триггеры. Перед тем как перейти к теме запросов, давайте изучим триггерное решение, в котором используется пакет к payroll (пример 10.3). Эти триггеры заменяют функции INSERT, DELETE и UPDATE из к payroll. Пакет сохраняется, чтобы можно бьио воспользоваться преимуществами общего кода и глобальных переменных. Пример 10.3. Использование триггеров для обеспечения безопасности таблицы PAYROLL CREATE OR REPLACE TRIGGER pay bir BEFORE INSERT ON payroll FOR EACH ROW BEGIN IF :new.dept о k payroll.my dept THEN raise application error (-20001, Insufficient Privileges); END IF; IF NOT k payroll.mgr THEN :new.salary ;= NULL; END IF; END pay bir; CREATE OR REPLACE TRIGGER pay bdr BEFORE DELETE ON payroll FOR EACH ROW BEGIN IF :new.dept <> k payroll.my dept OR NOT kjayroll.mgr THEN raise application error (-20001, Insufficient Privileges); END IF; END pay bdr; / CREATE OR REPLACE TRIGGER pay bur BEFORE UPDATE ON payroll FOR EACH ROW BEGIN IF :new.dept О k payroll.my dept THEN raise application error (-20001, Insufficient Privileges); END IF; IF NOT k payroll.mgr THEN :new.salary ;= :old.salary; END IF; IF :new.dept О :old.dept THEN raise application error (-20002, Cannot transfer department); END IF; END pay bur;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |