【发布时间】:2013-04-19 17:22:02
【问题描述】:
我有一个关于 Oracle 和检查权限的问题。
一些背景信息
我编写了一些 php 脚本来“测试”我们环境中的各种事物。其中一项任务是检查用户是否对某个过程具有执行权限以及该过程是否有效/已编译。
这里是查询
select ao.object_name, utp.grantee, ao.status, utp.privilege
from all_objects ao, user_tab_privs utp
where utp.owner = ao.owner and
ao.object_name = utp.table_name and
upper( ao.object_name ) = :object_name and
ao.object_type = 'PACKAGE' and
utp.privilege = 'EXECUTE' and
ao.status = 'VALID'
这很有效,并为我们节省了处理程序权限的时间;我现在确实意识到我也可以仔细检查 all_tab_privs 以检查执行访问权限。
问题
现在我的问题是,我如何对表格做类似的事情?我们遇到了一个问题,即某个用户在表上有 SELECT privs 但没有 UPDATE/INSERT privs。如何单独检查这些权限。我查看了 all_tab_privs 但没有发现它向我展示了我想要的东西。它有我可以执行的程序,但是当我检查是否存在已知表时,它不存在。例如,我将运行以下命令
select * from all_tab_privs
where table_name = 'KNOWN_TABLE' and
grantee = 'CURRENT_USER'
and privilege in ( 'SELECT', 'UPDATE', 'INSERT' );
但是我知道 100% 我已经可以选择/插入/更新,而不是为一个表返回 3 行,它什么也不返回。
有什么想法吗?谢谢。
免责声明
我知道我可以尝试插入/更新数据然后删除它,但我不想这样做。我宁愿不留下任何痕迹,因为这些脚本会定期运行,应该是可重复的,并且不应该改变任何数据的状态,即使它只是桌子上的一个序列。
另外,如果您可以提供一个可能的查询“列表”,我可以使用这些查询来确定权限,那很好。例如,要确定我是否有选择访问权限,请运行查询 1、2 和 3。如果其中任何一个返回数据,那么您就可以选择 privs 等进行插入/更新。
【问题讨论】:
-
如果您将 DML 语句作为测试运行,您不打算先插入然后删除,而是先插入然后回滚。当然,它仍然会增加序列,并且您可能会遇到外键问题。
-
您有通过角色授予的表权限吗?如果是这样,只有角色会显示为
grantee,而不是每个具有该角色的用户。 -
不,我们不通过角色授予访问权限。无论哪种方式,如果它是由角色授予的,我不知道要查询哪个表。你能提供一个示例查询吗?
-
@AlexPoole,我想我错了。我做了检查,看起来我们正在对某些事情进行一些基于角色的访问,所以我可能需要组合查询来确定我是否有访问权限。
-
你可以从this article by @René Nyffenegger得到这个想法。由于可以将角色授予角色,因此您需要递归地遍历它们以获取实际的对象授予。
标签: oracle oracle10g oracle11g