【问题标题】:Difference between query of privileges in tables表中权限查询的区别
【发布时间】:2011-11-10 17:49:50
【问题描述】:

在阅读this answer 发现了一个查询来查找一个表的权限:

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';

每个查询之间有一些实质性差异吗?

【问题讨论】:

    标签: sql oracle privileges


    【解决方案1】:

    它们完全不同,是的。

    在 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 来确定哪些用户可以访问特定的表。

    【讨论】:

    • 我不明白您指定查询需要表所有者的部分。我进行了两个查询,我在 WHERE 子句中写的唯一内容是表名,仅此而已。
    • @Galled - ALL_TAB_PRIVS 有一个 TABLE_SCHEMA 列,ROLE_TAB_PRIVS 有一个 OWNER 列。您的查询几乎肯定要指定表的所有者/模式。否则,如果在不同的架构中创建同名表,则查询结果会突然以一种潜在的微妙方式发生变化。
    猜你喜欢
    • 2012-09-10
    • 2012-05-17
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多