Программирование >>  Oracle 

1 ... 344 345 346 [ 347 ] 348 349 350 ... 469


Тщательный контроль доступа 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.

Поскольку мы выступаем в качестве обычного сотрудника, права изменять и удалять записи у нас быть не должно. Проверим:



1 ... 344 345 346 [ 347 ] 348 349 350 ... 469

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