![]() |
|
Программирование >> Oracle
Тщательный контроль доступа 1485 tkyte@TKYTE816> create or replace function rls examp 2 (p schema in varchar2, p object in varchar2) 3 return varchar2 4 as 5 l uid number; 6 begin 7 select user id 8 into l uid 9 from all users 10 where username - J HECyiECTByK4Er0 n0nbP30BATEnj; 12 return x > sys context(myctx,x); 13 end; 14 / Function created. Эта функция специально написана так, чтобы возбуждалась и не обрабатывалась исключительная ситуация NO DATA FOUND. Любопытно посмотреть, что произойдет, если исключительная ситуация распространится на уровень ядра сервера. Инициируем вызов этой функции: tkyte@TKYTE816> exec set ctx(0); PL/SQL procedure successfully completed. tkyte@TKYTE816> select * from t; select * from t ERROR at line 1: ORA-28112: failed to execute policy function Это означает, что функция, реализующая правила защиты, существует и синтаксически корректна, но при ее выполнении возбуждается исключительная ситуация. При возникновении этой ошибки создается файл трассировки. Если посмотреть содержимое каталога, задаваемого параметром инициализации USER DUMP DEST и найти этот файл трассировки, в самом начале можно обнаружить следующее: *** SESSION ID:(8.405) 2001-04-16 17:03:00.193 *** 2001-04-16 17:03:00.193 Policy function execution error: Logon user : TKYTE Table or View : TKYTE.T Policy name : T POLICY Policy function: TKYTE.RLS EXAMP ORA-01403: no data found ORA-06512: at TKYTE.RLS EXAMP , line 7 . ORA-06512: at line 1 Эта информация позволяет определить, в каком месте функции произошла ошибка. Явно сказано про строку 7, содержащую оператор SELECT ... INTO, a также указано, что в этой строке возбуждена исключительная ситуация NO DATA FOUND. 1486 Глава 21 ORA-28113: ошибка в предикате методики Сообщение об ошибке ORA-28113: policy predicate has error вгдается при в1полне- нии оператора SELECT или оператора ЯМД для таблицы, относительно которой заданы правила защиты, если соответствующая функция возвращает синтаксически или семантически неверное условие. Это условие при добавлении к исходному запросу дает синтаксически неправильный SQL-оператор. При возникновении ошибки ORA-28113 в каталоге, заданном параметром инициализации USER DUMP DEST, генерируется файл трассировки. В нем будет сообщение об ошибке ORA-28113 и информация о текущем сеансе и ошибочном условии. Пусть, например, функция реализована так, как показано ниже. Она возвращает условие, сравнивающее значение в столбце X с несуществующим столбцом таблицы: 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 return x = несуществующий стол6ец; 7 end; Function created. Так что запрос вида: select * from t будет переписан как: select * from (select * from t where x = несуществующий стол6ец) Очевидно, поскольку в таблице T такого столбца нет, этот запрос выполнить нельзя. tkyte©TKYTE816> select * from t; select * from t * ERROR at line 1: ORA-28113: policy predicate has error Функция успешно вернула условие, но при добавлении этого условия к запросу произошла ошибка. В конце текста соответствующего файла трассировки на сервере мы обнаружим: *** SESSION ID:(8.409) 2001-04-16 17:08:10.669 *** 2001-04-16 17:08:10.669 Error information for ORA-28113: Logon user : TKYTE Table or View : TKYTE.T Policy name : T POLIGY Policy function: TKYTE.RLS EXAMP RLS predicate : Тщательный контроль доступа 1487 x = несуществукщий столбец ORA-00904: invalid column name Этой информации достаточно для решения проблемы (изменения условия, которое привело к в]даче сообщения об ошибке), поскольку, помимо ошибочного условия, имеется сообщение об ошибке в этом условии. ORA-28106: вводимое значение для аргумента #2 неверно Если имя атрибута не является допустимым идентификатором Oracle, сообщение об ошибке можно получить при вызове процедуры DBMS SESSION.SET CONTEXT. Атрибуты в контексте приложения должны именоваться с соответствии с соглашениями, принятыми в Oracle (точно так же, как имена столбцов таблиц или переменных PL/SQL). Единственное решение - изменить имя атрибута. Нельзя, например, использовать атрибут контекста с именем SELECT, придется переименовать его. Резюме В этой главе б1ли подробно рассмотрены средства тщательного контроля доступа. Есть много аргументов за использование этих средств и лишь несколько - против. В общем-то, найти аргументы против использования этих средств непросто. Мы рассмотрели, как средства тщательного контроля доступа: Упрощают разработку приложений. Они отделяют управление доступом от приложения, приближая его к данным. Гарантируют постоянную защиту данн1х. Независимо от того, какое средство использовано для доступа к данным, правила защиты применяются неукоснительно, и обойти их нельзя. Позволяют изменять правила защг1 без изменения клиентских приложений. Упрощают управление объектами базы данн1х. Их использование позволяет уменьшить количество объектов базы данных, необходимых для поддержки приложения. Эти средства обеспечивают отличную производительность. Производительность фактически зависит от производительности алгоритмов и SQL-операторов, реализующих правила защиты. Если возвращаемое условие не позволяет оптимизатору выработать эффективный план выполнения, это никак не связано со средствами тщательного контроля доступа, а исключительно с настройкой SQL-оператора. Использование контекста приложения позволяет воспользоваться всеми преимуществами разделяемых SQL-операторов и уменьшить количество создаваемых для базы данных объектов. Средства тщательного контроля доступа не снижают производительность в большей степени, чем любой другой способ выполнения тех же проверок. Б1ло также показано, что эти средства могут создавать определенные проблемы при отладке, поскольку тщательный контроль доступа выполняется в фоновом режиме и обычные средства, например, отладчик или пакет DBMS OUTPUT, не помогают. Пакеты, вроде упомянутого в разделе Ошибки, которые могут возникнуть пакета debug, упрощают трассировку и отладку приложений, использующих средства тщательного контроля доступа.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |