表中权限查询的区别

时间:2011-11-10 17:49:50

标签: sql oracle privileges

阅读this answe我发现了一个查询以查找表的权限:

SELECT * FROM ALL_TAB_PRIVS WHERE TABLE_NAME = 'MY_TABLE'

但朋友告诉我这个问题:

select a.USERNAME,a.GRANTED_ROLE,b.ROLE,b.owner,b.TABLE_NAME,b.privilege
from user_role_privs a,role_tab_privs b
where b.ROLE=a.GRANTED_ROLE and b.TABLE_NAME = 'MY_TABLE';

每个查询之间有一些实质性的区别吗?

1 个答案:

答案 0 :(得分:2)

他们是完全不同的,是的。

在Oracle中,可以直接向用户授予对表的权限(在这种情况下,它们将显示在ALL_TAB_PRIVS中),或者可以将权限授予角色(在ROLE_TAB_PRIVS中可见)和该角色可以授予用户(在USER_ROLE_PRIVS中可见)。第一个查询将显示在表上具有直接授权的用户。第二个查询将向您显示已被授予已被授予对表的访问权限的角色的用户(请注意,在这两种情况下,除了表名之外,您确实应该指定OWNER。两者都不会显示有关通过多个嵌套级别的角色进行的授权的信息(即,用户A已被授予角色1,角色1已被授予角色2,角色2已被授予对表的访问权限)。通过角色进行的授权也会变得有点棘手,因为可以在会话中启用和禁用默认角色和非默认角色以及受密码保护的角色和角色。

一般情况下,如果您希望获得涵盖所有可能情况的内容,我建议您查看scripts available on Pete Finnigan's site。在这种情况下,您可能希望使用他的who_can_access script来确定哪些用户可以访问特定的表。