【问题标题】:What privileges does a role grant?角色授予什么特权?
【发布时间】:2017-02-03 12:30:14
【问题描述】:

我有一个带有一些用户定义角色的 Oracle 数据库。我想创建一个具有非常相似权限的新角色(对于不同的架构,它是相同的角色),但我不知道这个角色授予什么权限。

有没有我可以用来解决这个问题的查询?

(我试过了

SELECT * FROM DBA_TAB_PRIVS
WHERE GRANTEE IN
    (SELECT granted_role FROM DBA_ROLE_PRIVS
     WHERE GRANTEE = 'USER');

来自an answer for another question,但我收到了no rows selected。)

【问题讨论】:

  • 您是在使用文字字符串'USER' 还是在替换实际的用户名值? (如果您正在寻找自己的用户,您可以使用不带引号的 USER 函数;但在它周围加上引号使其成为文字值)。您链接到的问题是“用所需的用户名替换 USER”,但我不确定您是否已经这样做了......还请记住,用户名的大小写必须与 dba_users 视图中的内容相匹配,并且是通常大写。
  • 我确实用大写和小写版本替换了“用户”部分
  • 好的,这很尴尬......我不小心再次运行了相同的查询,现在我选择了 83 行。我一定是第一次输错了用户名。
  • 现在唯一要弄清楚的是如何从 sql plus 产生的混乱中获取我需要的信息

标签: oracle


【解决方案1】:

您替换 'USER' 的值必须是有效的用户名,大写(通常 - 除非用户是使用带引号的标识符创建的)以匹配用户在 DBA_USERS 中的条目。

如果您尝试复制角色,您可能会发现使用 the DBMS_MATADATA package 提取 DDL 和依赖 DDL 更容易,例如:

set long 32767

exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);

select dbms_metadata.get_ddl('ROLE', granted_role)
from dba_role_privs where grantee = 'USER';

select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', granted_role)
from dba_role_privs drp
where grantee = 'USER'
and exists (
  select null from dba_sys_privs dsp where dsp.grantee = drp.granted_role
);

select dbms_metadata.get_granted_ddl('OBJECT_GRANT', granted_role)
from dba_role_privs drp
where grantee = 'USER'
and exists (
  select null from dba_tab_privs dtp where dtp.grantee = drp.granted_role
);
and then edit the output to change names and schema etc. as required.

如果有多个角色,输出的顺序可能不会完全符合您的要求,但如果出现问题,您可以使用游标并写入文件。如果您有嵌套角色,则需要识别这些角色,然后获取它们的依赖 DDL。

【讨论】:

  • 我感觉这就是我要找的东西,但我收到了 ORA-31608: specified object of type OBJECT_GRANT not foundORA-31608: specified object of type SYSTEM_GRANT not found 错误。 (这有点好笑,因为我在错误出现之前使用 OBJECT_GRANT 得到了实际结果。
  • @yfg - 我认为这意味着您至少有一个只有系统授权的角色,以及一个只有对象授权的角色?尽管在这种情况下两个查询都不应该产生任何输出......除非你在 PL/SQL 循环中这样做。我添加了一个exists 检查,希望能避免这个问题。
【解决方案2】:

如果您没有选择任何行,那么您可能没有任何授予的角色。 也许您拥有直接授予用户的权限:

 SELECT * FROM DBA_TAB_PRIVS 
 WHERE GRANTEE = 'USER';

确保您有权访问此视图。

UPD亚历克斯·普尔

您可以拥有选择目录角色。

【讨论】:

  • no rows selected
  • 但是SELECT * FROM USER_ROLE_PRIVS; 与用户似乎给了我一些角色...
  • 试试这个 - SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN (SELECT grant_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USER');
  • no rows selected
  • 您不必以 sysdba 身份连接即可查看 DBA 数据字典视图。例如,您可以将the select catalog role 作为非 DBA 用户..
【解决方案3】:

如果您想创建具有相同权限的新用户,您可以授予他相同的角色、系统和对象权限:

SELECT granted_role
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'USER'

然后将角色授予新用户

GRANT ROLE_NAME TO NEW_USER

选择直接授予用户的权限:

SELECT * FROM DBA_SYS_PRIVS 
WHERE GRANTEE='USER'

SELECT * FROM DBA_TAB_PRIVS 
WHERE GRANTEE = 'USER';

如果您想了解特定角色赋予您可以执行的权限

SELECT * FROM DBA_TAB_PRIVS
WHERE GRANTEE IN
(SELECT granted_role FROM DBA_ROLE_PRIVS
 WHERE GRANTEE = 'USER');

SELECT * FROM DBA_SYS_PRIVS
WHERE GRANTEE IN
(SELECT granted_role FROM DBA_ROLE_PRIVS
 WHERE GRANTEE = 'USER');

看看Privilege information in data Dictionary

【讨论】:

  • 不要创建新答案,编辑您现有的答案
  • 大部分内容已经在问题中链接到的答案中,并且没有解释为什么 OP 没有返回数据。
  • OP 说他尝试了一个查询。还有那个 SELECT * FROM USER_ROLE_PRIVS;给出了一些角色。因此,如果 OP 需要相同的权限或使用其他查询,我的答案就是授予此角色。
猜你喜欢
  • 2019-05-16
  • 2018-10-11
  • 2015-08-08
  • 1970-01-01
  • 2019-04-13
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多