Мне нужно запросить базу данных Oracle и получить обратно, какие привилегии предоставляются, какие роли и на каких объектах. Потому что я собираюсь либо отменить, либо предоставить привилегии ролям на объектах в соответствии с конфигурациями в системе управления базами данных, которую я создаю.Oracle - запрос, какие привилегии предоставляются, какие роли, на которых объекты
Когда я перебираю объекты, которые собираюсь обрабатывать, мне нужно знать, была ли уже предоставлена какая-либо из прав на этот объект. Это необходимо сделать перед очередью GRANT
или REVOKE
.
поставщик ODP.NET не поддерживает работу нескольких операторов Oracle, они должны работать по одному или инкапсулируются в BEGIN END
блоке (который затем считается одним оператором). Некоторые утверждения даже должны быть помещены внутри операторов EXECUTE IMMEDIATE
внутри блока, чтобы он работал.
Я знаю, что вы можете предоставить одну и ту же привилегию на объект несколько раз, не нарушая ничего, но (исправьте меня, если я ошибаюсь), отменяя привилегию от роли на объекте, который не имеет этой роли вызывать исключение и прерывать выполнение всего блока.
Прежде чем выполнять какие-либо действия в базе данных Oracle, я сначала запрошу всю информацию, необходимую мне для выполнения своей работы, поскольку я обнаружил, что это лучше всего подходит для производительности, а не для воспроизведения пинг-понга с сервером путем запроса для каждого объекта , роль или привилегия ...
При обработке базы данных Oracle я затем сравниваю локальную информацию, на которую я только что запросил, с сконфигурированной информацией и выполнял на ней различные действия.
Я использовал SQLTracker и нашел жаба, используя этот запрос для поиска привилегии на объекты для роли и удалил роли, где положение
SELECT dtp.PRIVILEGE,
dtp.grantable ADMIN,
dtp.grantee,
dtp.grantor,
dbo.owner,
dbo.object_type,
dbo.object_name,
dbo.status,
'' column_name
FROM ALL_TAB_PRIVS dtp, DBA_OBJECTS dbo
WHERE dtp.TABLE_SCHEMA = dbo.owner AND dtp.table_name = dbo.object_name
AND dbo.object_type IN
('TABLE',
'VIEW',
'PACKAGE',
'PROCEDURE',
'FUNCTION')
UNION ALL
SELECT dcp.PRIVILEGE,
dcp.grantable ADMIN,
dcp.grantee,
dcp.grantor,
dbo.owner,
dbo.object_type,
dbo.object_name,
dbo.status,
dcp.column_name
FROM ALL_COL_PRIVS dcp, DBA_OBJECTS dbo
WHERE dcp.TABLE_SCHEMA = dbo.owner AND dcp.table_name = dbo.object_name
AND dbo.object_type IN
('TABLE',
'VIEW',
'PACKAGE',
'PROCEDURE',
'FUNCTION');
Я думаю, этот запрос будет давать мне информацию, что мне нужно, но я Я боюсь проблем с производительностью при работе с очень большой базой данных Oracle с большим количеством объектов.
В: Каков наилучший способ запроса, для каких привилегий предоставляются роли, для которых объекты в базе данных Oracle?
Запрос, который я разместил, является лишь одним из моих собственных предложений, но, поскольку я задаю этот вопрос здесь, я, очевидно, не уверен в этом, и хотел бы получить какой-либо ввод по запросу.
Есть ли я на правильном пути? Нужно ли его модифицировать? Должен ли я отказаться от него и использовать совершенно другой подход?
Значит, вы говорите достаточно, чтобы запрашивать только таблицу ROLE_TAB_PRIVS? – furier
Это единственный способ получить роль прив. любой другой способ неявно использует эту таблицу в любом случае. – haki
кажется хорошим ответом, но я не чувствую, что могу классифицировать его как правильное, его решение предотвратить воссоздание исключения при отзыве привилегий. – furier