1

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

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

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

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

例如,我如何确定这是否已被授予?

 grant execute on sys.dbms_aqjms to NEWUSER;
4

1 回答 1

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;

输出:

说明 ORD
-------------------------------------------------- ---------- ----------
授予 user1 而 user2 没有的系统权限 1
创建视图 2
授予 user2 而 user1 没有的系统权限 3
创建表 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_系统表的版本以检查您当前登录的用户所拥有的权限。然后您可以将结果与其他用户的权限进行比较。

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

于 2013-11-07T21:48:17.307 回答