如何查看Oracle AQ用户的所有权限

时间:2013-11-07 21:20:41

标签: oracle queue database-administration oracle-aq

我正在尝试设置一个新的数据库用户来收听我们的OracleAQ队列中的主题。

我有一个多年前设置的旧用户,可以读取消息并将消息发布到队列中。

现在我正在尝试建立一个新用户,似乎它没有所需的所有GRANTS。

查看每个用户的GRANTS差异的最佳方法是什么?我试图比较它们,看看有什么不同。

例如,如何确定是否已授予此权限?

 grant execute on sys.dbms_aqjms to NEWUSER;

1 个答案:

答案 0 :(得分:3)

您可以使用系统视图检查某个用户被授予的权限:

  • USER_SYS_PRIVS - 授予当前用户的系统权限
  • DBA_SYS_PRIVS - 授予用户和角色的系统权限
  • USER_TAB_PRIVS - 授予用户为授予者,受让人或所有者的对象
  • ALL_TAB_PRIVS - 授予用户为授权者,被授予者,所有者或已启用角色或PUBLIC为受让人的对象
  • DBA_TAB_PRIVS - 授予数据库中的所有对象
  • DBA_ROLES All - 数据库中存在的角色
  • DBA_ROLE_PRIVS - 授予用户和角色的角色
  • DBA_SYS_PRIVS - 授予用户和角色的系统权限
  • DBA_TAB_PRIVS - 对用户和角色的所有对象授予
  • ROLE_ROLE_PRIVS - 授予角色的角色
  • ROLE_SYS_PRIVS - 授予角色的系统权限
  • ROLE_TAB_PRIVS - 授予角色的表权限

例如,要检查用户具有哪个系统权限而另一个用户未被授予,反之亦然,您可以使用(您必须以SYS用户身份运行它):

CREATE USER user1 IDENTIFIED BY user1;

GRANT CREATE SESSION TO user1;
GRANT CREATE VIEW TO user1;

CREATE USER user2 IDENTIFIED BY user2;

GRANT CREATE SESSION TO user2;
GRANT CREATE TABLE TO user2;

(SELECT 'System privileges granted to user1 which user2 does not have' AS description, 1 AS ord FROM dual
UNION
SELECT privilege, 2 FROM dba_sys_privs WHERE grantee = 'USER1'
MINUS
SELECT privilege, 2 FROM dba_sys_privs WHERE grantee = 'USER2')
UNION
(SELECT 'System privileges granted to user2 which user1 does not have', 3 FROM dual
UNION
SELECT privilege, 4 FROM dba_sys_privs WHERE grantee = 'USER2'
MINUS
SELECT privilege, 4 FROM dba_sys_privs WHERE grantee = 'USER1')
ORDER BY 2;

输出:

DESCRIPTION                                                         ORD
------------------------------------------------------------ ----------
System privileges granted to user1 which user2 does not have          1 
CREATE VIEW                                                           2 
System privileges granted to user2 which user1 does not have          3 
CREATE TABLE                                                          4 

要检查用户是否被授予EXECUTE ON sys.dbms_aqjms权限,您可以发出以下查询:

GRANT EXECUTE ON sys.dbms_aqjms TO user1;

SELECT * FROM dba_tab_privs WHERE grantee = 'USER1' AND table_name = 'DBMS_AQJMS';

输出:

GRANTEE   OWNER  TABLE_NAME  GRANTOR  PRIVILEGE  GRANTABLE HIERARCHY
--------- ------ ----------- -------- ---------- --------- ---------
USER1     SYS    DBMS_AQJMS  SYS      EXECUTE    NO        NO        

如果您无权访问SYS用户,则可以查询系统表的user_版本,以检查您当前登录的用户拥有的权限。然后,您可以将结果与其他用户的权限进行比较。

您已考虑到,该用户可能已被授予角色,并且该角色可能被授予角色,因此您还必须比较授予每个用户的角色。