Программирование >>  Проектирование баз данных 

1 ... 86 87 88 [ 89 ] 90 91 92 ... 184


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;



1 ... 86 87 88 [ 89 ] 90 91 92 ... 184

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика