我需要查询一个Oracle数据库并取回哪些权限被授予哪些角色和哪些对象。因为我将根据我正在创建的数据库管理系统中的配置撤销或授予对象角色的权限。
当我遍历要处理的对象时,我需要知道角色是否已被授予对该对象的任何特权。这需要在排队GRANT
或执行之前REVOKE
完成。
ODP.NET提供程序不支持运行多个 Oracle 语句,它们必须一个接一个地运行或封装在一个BEGIN END
块中(然后算作单个语句)。有些语句甚至必须放在EXECUTE IMMEDIATE
块内的语句中才能工作。
我知道您可以多次将对象上的相同权限授予角色而不会破坏任何内容,但是(如果我错了,请纠正我)从角色上撤消该角色没有的对象上的权限会引发异常和中断整个块的执行。
在对 Oracle 数据库执行任何操作之前,我首先查询完成工作所需的所有信息,因为我发现这对于性能而言是最好的,而不是通过查询每个对象、角色或权限来与服务器打乒乓球...
然后,在处理 Oracle 数据库时,我将刚刚查询的本地信息与配置的信息进行比较,并据此执行不同的操作。
我使用 SQLTracker 并找到 Toad 使用此查询查找授予角色对象的权限并删除角色 where 子句
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 数据库上哪些对象的哪些角色授予哪些权限的最佳方法是什么?
我发布的查询只是我自己的建议之一,但由于我在这里提出这个问题,我显然对此不确定,并希望对查询进行一些输入。
我在正确的轨道上吗?是否需要修改?我应该废弃它并使用完全不同的方法吗?