我正在使用Linux,Oracle10g。我创建了一个名为test的用户。并授予create session并为该用户选择任何词典权限。
我还将sysdba和sysoper角色授予了相同的用户。
现在,我想显示授予用户的所有特权和角色。我发现以下查询,但它仅显示创建会话和选择字典特权。
select privilege
from dba_sys_privs
where grantee='SAMPLE'
order by 1;
请帮助解决问题。
谢谢
我正在使用Linux,Oracle10g。我创建了一个名为test的用户。并授予create session并为该用户选择任何词典权限。
我还将sysdba和sysoper角色授予了相同的用户。
现在,我想显示授予用户的所有特权和角色。我发现以下查询,但它仅显示创建会话和选择字典特权。
select privilege
from dba_sys_privs
where grantee='SAMPLE'
order by 1;
请帮助解决问题。
谢谢
Answers:
查看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;
SELECT * FROM
那些表。让我们不要偷懒...当我看不到代码时,我会感到沮丧。并非每个人都能读懂您的确切语法,并且文档链接可能会移动。
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
USER_ROLE_PRIVS
将不会为您工作,因为:“ USER_ROLE_PRIVS描述了授予当前用户的角色”,如Oracle文档所述。相反,您应该在DBA_ROLE_PRIVS
视图中查找信息。为什么?因为:“DBA_ROLE_PRIVS描述授予数据库中的所有用户和角色的角色”
没有其他答案对我有用,因此我编写了自己的解决方案:
从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子句。
如果通过某些角色将特权授予用户,则可以在下面的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';
结合先前的建议来确定您的个人权限(即“ 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);
始终使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_PRIVS
,USER_TAB_PRIVS
以及USER_SYS_PRIVS
,对于给定用户,然后2)给该输入(如在ShamrockCS”接听)给用户的角色。我认为,鉴于OP的问题,这是我们要了解给定用户而不是具有给定角色的用户的属性的地方。
我能够理解的唯一可见结果是,首先与要获取权限的用户建立联系,然后与以下查询:
SELECT GRANTEE, PRIVILEGE, TABLE_NAME FROM USER_TAB_PRIVS;