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

1 ... 351 352 353 [ 354 ] 355 356 357 ... 469


1482 Глава 21

Export file created by EXPORT:V08.01.06 via conventional path import done in WE8ISO8859P1 character set and WE8ISO8859P1 NGHAR character set

. importing SYSs objects into SYS

. importing TKYTEs objects into TKYTE

. . importing table T 1 rows Sported

Можно также с помощью процедуры DBMS RLS.ENABLE POLICY временно отключить правила и включить их после импортирования. Как и в случае экспорта, не желательно, поскольку в процессе импортирования таблица не защищена.

Отладка

При написании функций, возвращающих условия, я часто использую пакет срегв отладки, debug. Этот пакет, созданный сотрудником корпорации Oracle Кристофером Беком (Christopher Beck), позволяет включить в код операторы отладочной печати. Он позволяет свободно вставлять в код операторы вида:

create function foo .. . as

begin

debug.f(Bxoд в процеру foo); if (some condition) then l predicate := x=l; end if;

debug.f(Возвращаем условие %s, l predicate); return l predicate;

end;

Итак, процедура debug.f работает аналогично С-функции printf и реализована с помощью средств пакета UTL FILE. Она создает управляемые программистом файлы трассировки на сервере базы данных. Файлы трассировки содержат результаты отладочной печати, благодаря которым можно понять, как выполняется код. Поскольку ядро сервера вызывает код реализующих правила защиты функций в фоновом режиме, отладка их затруднена. Традиционные средства вроде пакета DBMS OUTPUT и отладчика PL/L тут не особенно помогут. При наличии файлов трассировки можно сэкономить очень много времени. Среди сценариев, которые можно загрузить с сайта издательства Wic находится и пакет debug c комментариями по его настройке и использованию.

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

Ошибки, которые могут произойти

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



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

ложения очень затруднена. Изучив следующие разделы, вы сможете находить и успешно устранять причины ошибок*.

ORA-28110: пакет или функция <имя функции> методики имеет ошибку

Эта ошибка свидетельствует о том, что в пакете или функции, реализующей правила защиты, имеется ошибка, и перекомпиляция ее невозможна. Если выполнить в среде SQL*Plus команду SHOW ERRORS FUNCTION <ИМЯ ФУНКЦИИ> или SHOW IRORS PACKAGE BODY <ИМЯ ПАКЕТА>, можно получить соответствующие сообщения об ошибках.

Эта ошибка может быть связана с тем, что:

один из объектов, на который ссглается функция, удален или стал недействительным;

в компилируемом коде есть синтаксическая ошибка или его по какой-то причине нельзя скомпилировать.

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

tkyte@TKYTE816>create or replace function rls examp

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

3 return varchar2

4 as

5 begin

6 this is an error

7 return x > sys context(myctx,x);

8 end;

Warning: Function created with compilation errors.

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

tkyte@TKYTE816> exec set ctx(0);

PL/SQL procedure successfully completed.

tkyte@TKYTE816> select * from t;

select * from t *

ROR at line 1:

ORA-28110: policy function or package TKYTE.RIS AMP has error

Тексты сообщений об ошибках в названиях подразделов здесь представлены так, как их выдает сервер Oracle 8.1.6 при установке русского в качестве языка сообщений. В примерах кода оставлены сообщения об ошибках на английском. Обратите внимание на расхожденияв терминологии: методика вместо правила . - Прим. научн. ред.



1484

Глава 21

Итак, это сообщение свидетельствует о наличии ошибки, а именно, об ошибке в функции TKYTE.RLS EXAMP (ее не удалось успешно скомпилировать). Для того чтобы ходить подобные проблемы прежде, чем они возникнут, пригодится следующий запрос:

tkyte@TKYTE816> column pf owner format a10 tkyte@TKYTE816> column package format a10

tkyte@TKYTE816> column function format a10

tkyte@TKYTE816> select pf owner, package, function

2 from user policies a

3 where exists (select null

4 from all objects

5 where owner = pf owner

6 andobject type in (FUNGTION, PAGKAGE,

7 PAGKAGE BODY)

8 and status = INVALID

9 and object name in (a.package, a.function)

10 )

11 /

PF OWNER PACKAGE FUNCTION

TKYTE RLS EXAMP

Этот запрос выдает список всех недопустим1х функций, реализующих правила защ:. Пока что он подтверждает то, что мы и так знаем, - что функция TK[E.RLS EXP скомпилирована с ошибками. Решить эту проблему несложно. Выполняем:

tkyte@TKYTE816> show errors function rls examp

Errors for FUNGTION RLS EXAMP:

LINE/GOL ERROR

6/10 PLS-00103: Encountered the symbol AN when expecting one of tiie following: := . ( © % ;

Исправляем ошибку в строке 6 с текстом this is an error, и сообщение ORA-28110 выдаваться не будет.

ORA-28112: сбой при выполнении функции методики

Сообщение об ошибке ORA-28112: failed to execute policy function выдается при в1-полнении оператора SELECT или оператора ЯМД для таблицы, относительно которой заданы правила защиты, если в реализующей эти правила функции (а не в возвращаемом ею условии) произошла ошибка. Это означает, что при выполнении функции возбуждена исключительная ситуация, не обработанная в самой функции и полученная ядром сервера.

При возникновении ошибки ORA-28112 в каталоге, заданном параметром инициализации USER DUMP DEST, будет генерироваться файл трассировки. В этом файле не будет сообщения об ошибке ORA-28112, но будет фраза Policy function execution error

Зададим для функции следующий алгоритм (продолжаем предыдущий пример):



1 ... 351 352 353 [ 354 ] 355 356 357 ... 469

https://www.bordur-trotuar.ru купить брусчатка распродажа.
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика