|
Программирование >> Oracle
Тщательный контроль доступа 1461 6 statementtypes => select); 7 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> begin 2 dhms rls.add policy 3 (object name => EMP, 4 policy name => HR APP UPDATE POLICY, 5 policy function => HR PREDICATE PKG.UPDATE FONCTION, 6 statement types => update, 7 update check => TRUE); 8 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> begin 2 dbms rls.add policy 3 (object name => EMP, 4 policy name -> HR APP INSERT DELETE POLICY, 5 policy function => HR PREDICATE PKG.INSERT DELETE FDNCTION , 6 statement types => insert, delete, 7 update check => TRUE); 8 end; PL/SQL procedure successfully completed. Итак, с каждой из операций ЯМД мы связали функцию, возвращающую условие. Когда пользователь обращается с запросом к представлению ЕМР, используется условие, генерируемое функцией HR PREDICATE PKG.SELECT FUNCTION. При изменении данных будет вызвана функция UPDATE FUNCTION этого пакета и т.д. Теперь протестируем приложение. Мы создадим пакет HR APP. Этот пакет будет выступать в роли приложения. В нем есть подпрограммы для: выборки данных (процедура listEmps); изменения данных (процедура updateSal); удаления данных (процедура deleteAll); вставки новых данных (процедура insertNew). Мы будем регистрироваться от имени различных пользователей, с разными ролями и контролировать работу приложения. В результате будет продемонстрировано, как работают средства тщательного контроля доступа. Вот спецификация приложения: tkyte@TKYTE816> create or replace package hr app 2 as 3 procedure listEmps; 4 5 procedure updateSal; 6 1462 Глава 21 7 procedure deleteAll; 9 procedure insertNew(p deptno in number); 10 end; 11 / Package created. Теперь перейдем к телу пакета. Этот пример несколько надуманный, поскольку процедура, выполняющая UPDATE, пытается изменить все возможные строки, задав гм одно и то же значение. Это сделано для того, чтобы можно б1ло точно увидеть, сколько и какие строки затрагиваются. Другие процедуры, по сути, похожи - они сообщают, что сделали и сколько строк обработано: tkyte@TKYTE816> create or replace package body hr app 2 as 4 procedure listEmps 5 as 6 l cnt number default 0; 7 begin 8 dbms output.put line 9 (rpad(ename,10) rpad(sal, 6 ) 10 rpad(dname,10) rpad(mgr,5) 11 rpad(dno,3)); 12 for x in (select ename, sal, dname, mgr, emp.deptno 13 from emp, dept 14 where emp.deptno = dept.deptno) 15 loop 16 dbms output.put line(rpad(nvl(x.ename,(null)),10) 17 to char(x.sal,9,999) II 18 rpad(x.dname,10) 19 to char(x.mgr,9999) 2 0 to char(x.deptno,99)); 21 l cnt := l cnt + 1; 22 end loop; 23 dbms output.put line(l cnt строк(и) выбрано); 24 end; 27 procedure updateSal 28 is 29 begin 30 update emp set sal = 9999; 31 dbms output.put line(sql%rowcount строк(и) изменено); 32 end; 34 procedure deleteAll 35 is 36 begin 37 delete from emp where empno <> sys context(Hr app Gtx,EMPNO); 38 dbms output.put line(sql%rowcount строк(и) удалено); Тщательный контроль доступа 1463 3 9 end; 41 procedure insertNew(p deptno in number) 42 as 43 begin 44 insert into emp (empno, deptno, sal) values (123, p deptno, 1111); 45 end; 47 end hr app; 48 / Package body created. tkyte@TKrE816> grant execute on hr app to public 2 / Grant succeeded. Вот и все наше приложение . Процедура listEmps выдает все записи, доступные в представлении EMP. Процедура updateSal изменяет все записи, которые разрешено изменять. Процедура deleteAll удаляет все записи, которые разрешено удалять, за исключением записи текущего пользователя. Процедура insertNew пытается создать новую запись о сотруднике указанного отдела. Это приложение просто проверяет выполнение всех возможных операций ЯМД с представлением ЕМР (как я уже писал, приложение это весьма надуманное). Теперь, регистрируясь от имени различных пользователей, проверим работу приложения. Сначала регистрируемся и просматриваем значения атрибутов в контексте приложения: tkyte@TKYTE816>connectadams/adams adams@TKYTE816> column namespace format a10 adams@TKYTE816> column attribute format a10 adams@TKYTE816>column value format a10 adams@TKYTE816>select * from session context; NAMESPACE ATTRIBUTE VALUE HR APP CTX ROLENAME EMP HR APP CTX USERNAME ADAMS HR APP CTX EMPNO 787 6 adams@TKYTE816>set serveroutput on Итак, поскольку мы зарегистрировались как обычный сотрудник, процедура listEmps должна выдать только одну запись - для этого сотрудника: adams@TKYTE816> exec tkyte.hr app.listEmps ename sal dname mgr dno ADAMS 1,100 RESEARCH 7788 20 1 строк(и) выбрано PL/SQLprocedure successfully completed. Поскольку мы выступаем в качестве обычного сотрудника, права изменять и удалять записи у нас быть не должно. Проверим:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |