|
Программирование >> Oracle
1458 Глава 21 6 g sel pred varchar2(1024) default NULL; 7 g upd pred varchar2(1024) default NULL; 8 g ins del pred varchar2(1024) default NULL; Константа G APP CTX содержит имя контекста приложения. Если когда-либо потребуется переименовать контекст, можно изменить значение этой, используемой в oc-тальномкоде константы. Если придется это имя менять, достаточно будет поменять значение константы в одном месте и перекомпилировать тело пакета. Остальные три глобальные переменные будут содержать условия. Этот пример создавался для версии Oracle 8.1.6. В этой версии есть проблема, связанная с кэшированием курсоров и средствами тщательного контроля доступа (подробнее см. в разделе Проблемы далее). Начиная с версии Oracle 8.1.7, этот прием программирования использовать необязательно. В данном случае реализуется правило, запрещающее менять роль после регистрации. Однажды сгенерированные в сеансе условия возвращаются для всех запросов. Мы не будем заново генерировать их для каждого запроса, так что любые изменения роли не повлияют на результат, пока пользователь не завершит сеанс и не зарегистрируется снова (или не сбросит состояние сеанса с помощью вызова DBMS SESSION.RESET PACKAGE). Теперь перейдем к первой из генерирующих условие функций. Она генерирует ус ловие для операторов SELECT, которые обращаются к представлению ЕМР. Обрати внимание, что она просто устанавливает значение глобальной переменной пакета G SEL PRED (Global SELect PREDicate - глобальное условие для SELECT) в зависимости от значения атрибута контекста RoleName. Если атрибут контекста не установлен, функция возбуждает исключительную ситуацию, которая приводит к неудачному завершению запроса: 11 function select function(p schema in varchar2, 12 p object in varchar2) return varchar2 13 is 14 begin 16 if (g sel pred is NULL) 17 then 18 if (sys context(g app ctx, RoleName) = EMP) 19 then 20 g sel pred:= 21 empno=sys context ( g app ctx ,EmpNo ); 22 elsif (sys context(g app ctx, RoleName) = MGR) 23 then 24 g sel pred := 2 5 empno in (select empno 26 from emp base table 27 start with empno = 2 8 sys context(g app ctx,EmpNo) 2 9 connect by prior empno = mgr) ; 31 elsif (sys context(g app ctx, RoleName) = HR REP) Тщательный контроль доступа 1459 32 then 33 g sel pred := deptno in 34 (select deptno 35 from hr reps 36 where username = 37 sys context(g app ctx,UserName)); 39 else 40 raise application error(-20005, Роль не установлена); 41 end if; 42 end if; 44 return g sel pred; 45 end; 46 Теперь перейдем к функции, возвращающей условие для операторов изменения. Алгоритм ее очень похож на алгоритм предыдущей функции, но условие возвращается другое. Обратите на использование условия 1=0, например, если атрибут RoleName имеет значение ЕМР. Рядовые сотрудники ничего изменять не могут. Руководители могут изменять записи своих подчиненных (но не собственную запись). Ответственные за кадры могут изменять записи всех сотрудников отдела, которым они занимаются: 47 function update function(p schema in varchar2, 48 p object in varchar2) return varchar2 49 is 50 begin 51 if (g upd pred is NULL) 52 then 53 if (sys context(g app ctx, RoleName) = EMP) 54 then 55 g upd pred := l=0; 57 elsif (sys context(g app ctx, RoleName) = MGR) 58 then 59 g upd pred := 60 empno in (select empno 61 from emp base table 62 where mgr = 63 sys context(g app ctx 64 , EmpNo)); 65 66 elsif (sys context(g app ctx, RoleName) = HR REP) 67 then 68 g upd pred := deptno in 69 (select deptno 70 from hr reps 71 where username = 72 sys context(g app ctx,UserName)); 74 else 75 raise application error(-20005, Роль не установлена) 1460 Глава 21 76 77 78 79 80 end; end if; end if; return g upd pred; Наконец, рассмотрим функцию для операторов INSERT и DELETE. B этом случае условие 1=0 возвращается для пользователей с ролями ЕМР и MGR: никто из них не может создавать и удалять записи - это прерогатива ответственных за кадры (пользователей с ролью HR REPS): 82 function insert delete function(p schema in varchar2 , 83 p object in varchar2) return varchar2 84 is 85 begin 86 if (g ins del pred is NULL) 87 then 8 8 if (sys context(g app ctx, RoleName ) in ( EMP, 89 then 90 g ins del pred := l=0; 91 elsif (sys context(g app ctx, 92 then 93 g ins del pred := deptno 94 (select deptno 95 from hr reps 96 where username = 97 sys context(g app ctx ,UserName)) ; 98 else 99 raise application error(-20005, Роль не установлена); 100 end if; 101 end if; 102 return g ins del pred; 103 end; 104 105 end; 106 / RoleName) HR REP) Package body created. До появления средств тщательного контроля доступа обеспечить применение этих трех условий при работе с одной таблицей можно было только за счет использования многочисленных представлений - по одному для операторов SELECT, UPDATE и INSERT/DELETE для каждой роли. Средства тщательного контроля доступа позволяют создать всего одно представление с динамически формируемыми условиями. Последний шаг в решении задачи - связывание условий с каждой операцией МД и представлением ЕМР. Это делается следующим образом: tkyte@TKYTE816> begin 2 dhmsrls. addpolicy 3 (objectname => EMP, 4 policy name => HR APP SELECT POLICY, 5 policy function => HR PREDICATE PKG.SELECT FUNCTION,
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |