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

1 ... 347 348 349 [ 350 ] 351 352 353 ... 469


1470

Глава 21

5 /

PL/SQL procedure successfully completed. tkyte@TKYTE816> begin

2 dbms rls.add policy

3 (object name => C,

4 policy name => C POLICY,

5 policy function => pred function,

6 statementtypes => DELETE);

7 end;

PL/SQL procedure successfully completed.

то окажется, что нельзя удалить ни одной строки из таблицы С с помощью SQL-опера-тора:

tkyte@TKYTE816> delete fromG;

0 rows deleted.

Установленное правило защиты не позволяет это сделать. Наличие строки в таблице С (в результате вставки в предыдущем примере) легко проверить:

tkyte@TKYTE816> select * from G;

Простое удаление строки в главной таблице:

tkyte@TKYTE816> delete from P;

1 row deleted.

снова позволяет обойти правило защиты, задаваемое средствами тщательного контроля доступа - соответствующая строка из таблицы С тоже автоматически удаляется:

tkyte@TKYTE816> select * fromG;

no rows selected

Изменение строк

Аналогичная ситуация при удалении строк из главной таблицы возникает и при пользовании в требовании целостности конструкции ON DELETE SET NULL. Немного изменим пример, чтобы, благодаря требованию целостности ссылок, можно было изменять строки в таблице С, которые нельзя изменять SQL-операторами. Начнем с пересоздания таблицы С, задав для внешнего ключа конструкцию ON DELETE SET NULL.

tkyte@TKYTE816> drop table c;

Table dropped.

tkyte@TKYTE816> create table c (x int references p on delete set null); Table created.



Тщательный контроль доступа 1471

tkyte@TKYTE816> insert into p values (1);

1 row created.

tkyte@TKYTE816> insert into c values (1);

1 row created.

Теперь зададим ту же функцию, что и в предыдущих примерах, в качестве правила защите! для изменения данных в таблице С, и установим флагу UPDATE CHECK значение TRUE. Это не позволит изменять строки:

tkyte@TKYTE816> begin

2 dbms rls.add policy

3 (object name -> С,

4 policy name => C POLICY,

5 policy function => pred function,

6 statement types => UPDATE,

7 update check => TRUE);

8 end;

PL/SQL procedure successfully completed.

tkyte@TKYTE816> update c set x = NULL;

0 rows updated.

tkyte@TKYTE816> select * from c; 1

Итак, с помощью SQL-операторов строки в таблице С изменять нельзя. Однако удаление строк из таблицы P показывает следующее:

tkyte@TKYTE816> delete from p;

1 row deleted.

tkyte@TKYTE816> select * from c;

Итак, обходным путем можно изменить данные в таблице С. Есть и другой способ продемонстрировать это, но данные в таблицах придется восстановить:

tkyte@TK:E816> delete from c;

1 row deleted.

tkyte@TKYTE816> insert into p values (1);

1 row created.

tkyte@TKYTE816> insert into c values (1);

1 row created.

Теперь перепишем функцию так, чтобы можно было изменять строки в таблице С, задавая им любые значения, кроме Null:



1472

Глава 21

tkyte@TKYTE816> create or replace function pred function

2 (p schema in varchar2, p object in varchar2)

3 return varchar2

4 as

5 begin

6 return x is not null;

7 end;

Function created.

tkyte@TKYTE816> update c set x = NULL; update c set x = NULL

ERROR at line 1:

ORA-2 8115 : policy with check option violation

Это изменение завершилось неудачно, поскольку условие X IS NOT NULL не будя выполняться после изменения. Если теперь снова удалить строку из таблицы P:

tkyte@TKYTE816>delete from p;

1 row deleted.

tkyte@TKYTE816> select * from c;

строка в таблице С получит значение, которое нельзя задать с помощью SQL-оператора непосредственно.

Кэширование курсоров

Одна из важных особенностей реализации функции, задающей правила защиты, из первого примера данной главы состоит в том, что в ходе сеанса эта функция возвращает одно и то же условие. Это принципиально важно. Если еще раз рассмотреть алгоритм этой функции:

5 as

6 begin

7 if (user = p schema) then

8 return ;

9 else

10 return owner = USER

11 end if;

12 end;

оказывается, что она возвращает либо пустое условие, либо условие owner = USER. Ho в течение сеанса она постоянно возвращает одно и то же условие. Невозможно получить условие owner = USER, a затем в том же сеансе получить пустое условие. Чтобы понять, почему это принципиально важно для корректного использования средств тщательного контроля доступа в приложении, надо разобраться, когда условие связывается



1 ... 347 348 349 [ 350 ] 351 352 353 ... 469

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