|
Навигация
|
Главная » Sql Oracle security policiesИсточник: habrahabr AndyBW В этой статье мне бы хотелось рассказать о решении, которое позволяет организовать ограничение доступа к данным на уровне СУБД, причем в том случае, когда ограничиваемая таблица сама содержит данные влияющие на ограничение. Пример, который я приведу, сильно упрощен, но необходимые средства, используемые в решении, предоставлены исчерпывающе. Протестировано на Oracle 11g R2. Предположим, что пользователю SCOTT, потребовалось организовать ограничение доступа к данным некоторых таблиц, но критерии, по которым должен предоставляться доступ выглядят так, что требуется производить анализ данных ограничиваемой таблицы. Казалось бы, что может быть проще - поехали.Установим соединение с БД от имени SCOTT и создадим таблицы, одна из которых будет содержать список пользователей имеющих доступ, а вторая сами данные: Всё прошло хорошо. Теперь выполним соединение от имени SYS, создадим функцию предикат и политику безопасности: Вот и всё, теперь пользователь SCOTT при обращении к таблице USER_DATA, будет видеть только те данные, которые в столбце ud_user_id принадлежат ему, в соответствии с настройкой в таблицеUSER_ALLOWED. Осталось это проверить, снова выполним вход от имени SCOTT и: Для того, что бы определить, в чем заключается ошибка, потребуется просмотреть трэйс файл, который содержит детальное описание: По сути дела, я бы назвал это аналогом мутации в триггере. Для решения возникшей проблемы, можно использовать… как показала практика, мало чего. Хотите, попробуйте сами, но учитывая, что реальная задача, будет сильно отличаться от приведенного примера. Вернемся к соединению от имени SYS, и выполним: Первое, что было сделано, это объявлен новый тип данных, отражающий таблицу из одного столбца типаNUMBER. Этот тип, будет использован для переменной пакета, в которую будет выбран список идентификаторов, по которым будет предоставлен доступ. Функция в пакете, является оберткой, позволяющей выполнить обратное обращение к данным. Проблем с содержимым переменной пакета, между сессиями возникать не будет, так как для каждой сессии выделяется отдельная область памяти. Подразумевая, что цель курсора в функции предикате - определение идентификаторов первичного ключа таблицы, формируемое ограничение целесообразнее модифицировать в конструкцию EXISTS. Теперь проверим результат проделанной работы, выполнив соединение от имени SCOTT:
Использование хранимых шаблонов при настройке приложений с недоступным исходным кодом. Уровни изолированности транзакций. Согласованность данных при изменении. USING - ключевое слово PL/SQL в версии 9i. Ускорение вставки. Главная » Sql |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |