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

1 ... 252 253 254 [ 255 ] 256 257 258 ... 469


1176

Глава 15

10 11 12 13 14 15 16 17 18

24 25 26 27 28 29 30 31

34 35 36

37 38 39 40 41 42 43 44

insert into (user, p pk, commit;

audit trail values

p attr, p dataum, sysdate);

end;

function record(p pk in number,

p attr in varchar2,

p dataum in number) return number

begin

log(p pk, p attr, p dataum) ; return p dataum;

end;

function record(p pk in number,

p attr in varchar2, p dataum in varchar2)

begin

log(p pk, p attr, p dataum); return p dataum;

end;

return varchar2

function record(p pk in number,

p attr in varchar2, p dataum in date) return

begin

log(p pk, p attr,

to char (p dataum, return p dataum;

end;

end;

date

dd-mon-yyyy hh24 :mi:ss))

Package body created.

tkyte@TKYTE816> create or replace view emp v

sal, sal) sal, comm, co) comm, hiredate, hiredate)

2 as

3 select empno , ename, job,mgr,

4 audit trail pkg.record(empno,

5 audit trail pkg.record(empno,

6 audit trail pkg.record(empno, hiredate, hiredate) hiredate,

7 deptno

8 from emp

View created.

Мы создали представление, возвращающее три столбца - HIREDATE, SAL и COMM -через PL/SQL-функцию. Эта PL/SQL-функция записывает, кто, что и когда просматривал. Это представление подходит для непосредственных поисковых запросов вида:



Автономные транзакции 1177

tkyte@TKYTE816> select empno, ename, hiredate, sal, comm, job 2 from emp v where ename = KING;

EMPNO ENAME HIREDATE SAL COMM JOB

7839 KING 17-NOV-81 5000 PRESIDENT

tkyte@TKYTE816> column username format a8 tkyte@TKYTE816> column pk format 9999 tkyte@TKYTE816> column attribute format a8 tkyte@TKYTE816> column dataum format a20

tkyte@TKYTE816> select * from audit trail;

USERNAME PK ATTRIBUT DATAUM TIMESTAMP

TKYTE 7839 hiredate 17-nov-1981 00:00:00 15-APR-01

TKYTE 7839 sal 5000 15-APR-01

TKYTE 7839 comm 15-APR-01

tkyte@TKYTE816> select empno, ename from emp v where ename = BLAKE

EMPNO ENAME

7698 BLAKE

tkyte@TKYTE816> select * from audit trail;

USERNAME PK ATTRIBUT DATAUM TIMESTAMP

TKYTE 7839 hiredate 17-nov-1981 00:00:00 15-APR-01 TKYTE 7839 sal 5000 15-APR-01

TKYTE 7839 comm 15-APR-01

Как видно по этим результатам, пользователь TKYTE просматривал столбцы HIREDATE, SAL и COMM в указанный день. По второму запросу информация из этих столбцов не получена, поэтому дополнительные записи в журнал проверки не внесены.

Подобное представление, как уже было сказано, подходит для простых справочных запросов, потому что в некоторых случаях оно регистрирует лишние попытки доступа. Бывают случаи, когда данные представления показывают, что кто-то просматривал фрагмент информации, тогда как фактически он его не видел. Он б1л отброшен в дальнейшем в сложном запросе или агрегирован в определенное значение, не имеющее отношения к данному лицу. Следующий пример показывает, что при агрегировании или использовании столбца в конструкции WHERE в журнал проверки вносится запись о том, что столбец просмотрен.

Начнем с очистки таблицы журнала проверки, чтобы происходящее стало очевидным:

tkyte@TKYTE816> delete from audit trail; 3 rows deleted. tkyte@TKYTE816> commit; Commit complete.

tkyte@TKYTE816> select avg(sal) from emp v;



1178

Глава 15

AVG(SAL)

2077.14286

tkyte@TKYTE816> select * from audit trail;

USERNAME PK ATTRIBUT DATAUM TIMESTAMP

TKYTE 7499 sal 1600 15-APR-01

TKYTE 7934 sal 1300 15-APR-01

14 rows selected.

tkyte@TKYTE816> select ename from emp v where sal >= 5000; ENAME

KING

tkyte@TKYTE816> select * from audit trail;

USERNAME PK ATTRIBUT DATAUM TIMESTAMP

TKYTE 7499 sal 1600 15-APR-01

TKYTE 7934 sal 1300 15-APR-01

28 rows selected.

При выполнении запроса с агрегированием зарегистрирован просмотр каждого значения зарплаты, которое бтло просмотрено для получения среднего, AVG(SAL). Запрос WHERE SAL >= 5000 записал каждую зарплату, которая просматривалась для получения ответа. Для таких случаев хороших решений нет, разве что не использовать представления в такого рода запросах. Для получения значения AVG(SAL) можно использовать представление, включающее столбец SAL и, возможно, другие данные. Зал-рос должен выполняться к представлению, не связывающему значение в столбце SAL с определенным лицом. Оно позволит просматривать зарплаты, но не узнавать, кто их получает. Проверить условие SAL >= 5000, не записав каждую зарплату, сложно. Я бы использовал хранимую процедуру, возвращающую курсорную переменную, REF CURSOR. В этой хранимой процедуре можно было бы обращаться к таблице ЕМР и проверять условия по столбцу SAL, но выбирать любую информацию, за исключением столбца SAL. Пользователь не узнает, сколько именно получил тот или иной человек, он узнает только, что зарплата превышала определенное значение. Представлением EMP V можно будет пользоваться только при необходимости получить одновременно и личную информацию (значения столбцов EMPNO и ENAME), и зарплату (SAL).

Выполнение операторов ЯМД в SQL в данном случае специфично, и делать это надо осторожно.

Когда среда позволяет выполнять только операторы SELECT

Это действительно удобное использование автономных транзакций в SQL-операто-рах. Во многих случаях используются инструментальные средства, позволяющие выпол-



1 ... 252 253 254 [ 255 ] 256 257 258 ... 469

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