如何在Oracle中查找授予用户的特权和角色?[重复]


77

我正在使用Linux,Oracle10g。我创建了一个名为test的用户。并授予create session并为该用户选择任何词典权限。

我还将sysdba和sysoper角色授予了相同的用户。

现在,我想显示授予用户的所有特权和角色。我发现以下查询,但它仅显示创建会话和选择字典特权。

select privilege 
from dba_sys_privs 
where grantee='SAMPLE' 
order by 1;

请帮助解决问题。

谢谢


Answers:


60

查看http://docs.oracle.com/cd/B10501_01/server.920/a96521/privs.htm#15665

使用这些选择语句检查USER_SYS_PRIVS,USER_TAB_PRIVS,USER_ROLE_PRIVS表

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS; 
SELECT * FROM USER_ROLE_PRIVS;

37
换句话说,做SELECT * FROM那些表。让我们不要偷懒...当我看不到代码时,我会感到沮丧。并非每个人都能读懂您的确切语法,并且文档链接可能会移动。
vapcguy

12
对于那些懒惰的人: SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS;
Victor Romano

如果您像我一样正在寻找被授予“数据库中所有内容”的角色,USER_ROLE_PRIVS将不会为您工作,因为:“ USER_ROLE_PRIVS描述了授予当前用户的角色”,如Oracle文档所述。相反,您应该在DBA_ROLE_PRIVS视图中查找信息。为什么?因为:“DBA_ROLE_PRIVS描述授予数据库中的所有用户和角色的角色”
阿德里安·哈拉米略

70

除了VAV的答案,第一个在我的环境中最有用

select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';

8
+1非常完整。放置“用户”而不是样本来获取有关当前登录用户的信息
daitangio

3
注:如果您使用dba_XXX_privs的列名是grantee不是username
骆马先生

57

没有其他答案对我有用,因此我编写了自己的解决方案:

从Oracle 11g开始。

用所需的用户名替换USER

授予的角色:

SELECT * 
  FROM DBA_ROLE_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 = 'USER';

如果要查找当前连接的用户,则可以用USER替换表名称中的DBA并删除WHERE子句。


这是最好的答案。谢谢。
Baodad

这里还有一个解决方法-授予授予用户角色的系统特权:SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE IN(从DBA_ROLE_PRIVS FROM SELECT grant_role WHERE GRANTEE ='DWMGR');
em_bo

10

如果通过某些角色将特权授予用户,则可以在下面的SQL中使用

select * from ROLE_ROLE_PRIVS where ROLE = 'ROLE_NAME';
select * from ROLE_TAB_PRIVS  where ROLE = 'ROLE_NAME';
select * from ROLE_SYS_PRIVS  where ROLE = 'ROLE_NAME';

当您具有通过角色提供的权限时,对深入了解很有帮助。.第二个查询帮助我大量检查了是否向我们提供了我们的表访问权限。
nanosoft's

9

结合先前的建议来确定您的个人权限(即“ USER”权限),然后使用以下方法:

-- your permissions
select * from USER_ROLE_PRIVS where USERNAME= USER;
select * from USER_TAB_PRIVS where Grantee = USER;
select * from USER_SYS_PRIVS where USERNAME = USER;

-- granted role permissions
select * from ROLE_ROLE_PRIVS where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_TAB_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);
select * from ROLE_SYS_PRIVS  where ROLE IN (select granted_role from USER_ROLE_PRIVS where USERNAME= USER);

1
优秀!这应该是真正的答案!
vapcguy

我认为这是最好的答案。对我来说真的很好。
Diego Romero Rodriguez

2
SELECT * 
FROM DBA_ROLE_PRIVS 
WHERE UPPER(GRANTEE) LIKE '%XYZ%';

1
select * 
from ROLE_TAB_PRIVS 
where role in (
    select granted_role
    from dba_role_privs 
    where granted_role in ('ROLE1','ROLE2')
)

0

始终使SQL可重用:-:)

-- ===================================================
-- &role_name will be "enter value for 'role_name'".
-- Date:  2015 NOV 11.

-- sample code:   define role_name=&role_name
-- sample code:   where role like '%&&role_name%'
-- ===================================================


define role_name=&role_name

select * from ROLE_ROLE_PRIVS where ROLE = '&&role_name';
select * from ROLE_SYS_PRIVS  where ROLE = '&&role_name';


select role, privilege,count(*)
 from ROLE_TAB_PRIVS
where ROLE = '&&role_name'
group by role, privilege
order by role, privilege asc
;

仅检查ROLES组中的给定角色。如果我们谈论的可重用性,应该1)通过循环USER组和吐出*USER_ROLE_PRIVSUSER_TAB_PRIVS以及USER_SYS_PRIVS ,对于给定用户,然后2)给该输入(如在ShamrockCS”接听)给用户的角色。我认为,鉴于OP的问题,这是我们要了解给定用户而不是具有给定角色的用户的属性的地方。
vapcguy

0

我能够理解的唯一可见结果是,首先与要获取权限的用户建立联系,然后与以下查询:

SELECT GRANTEE, PRIVILEGE, TABLE_NAME FROM USER_TAB_PRIVS;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.