在 Oracle 中找不到分配给已创建角色的权限

Posted

技术标签:

【中文标题】在 Oracle 中找不到分配给已创建角色的权限【英文标题】:Can not find Permissions assigned to created roles in Oracle 【发布时间】:2021-03-21 10:58:34 【问题描述】:

我在 SQL dev 中以 SYSTEM 身份登录并执行此操作:

ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;

CREATE TABLE Attendance
(
    ID INT ,
    NAME NVARCHAR2(300),

    CONSTRAINT IdPk PRIMARY KEY (ID)
);

CREATE ROLE DataEntry;
GRANT SELECT, INSERT, UPDATE ON Attendance TO DataEntry;

如何找到分配给 DataEntry 角色的权限?我研究了一段时间,但找到的答案不起作用。例如:

select * from ROLE_ROLE_PRIVS;
select * from ROLE_TAB_PRIVS;
select * from ROLE_SYS_PRIVS;

这些语句返回许多角色,例如:dba、sys、.... 但我仍然找不到我的“DataEntry”角色。谁可以给我解释一下这个?非常感谢。

【问题讨论】:

您是否有理由使用未记录的 _ORACLE_SCRIPT 设置?除非 Oracle 支持明确告诉您,否则用户不应该对此胡闹。将角色标记为 Oracle 管理会导致它从某些数据字典视图中排除,这不会让我感到震惊,但我不会在本地对其进行测试以找出答案。 mikedietrichde.com/2020/02/10/… 查看 > DBA > 安全 > 角色,sqldev 会显示你想要的一切 【参考方案1】:

如果您创建了以SYSTEM 连接的任何对象,您最好不要这样做。 SYSSYSTEM 很特别,不要乱来。


至于你的问题:

SQL> show user
USER is "SCOTT"
SQL> create role dataentry;

Role created.

SQL> grant select, insert, update on emp to dataentry;

Grant succeeded.

SQL> select * From role_tab_privs;

ROLE       OWNER      TABLE_NAME COLUMN_NAM PRIVILEGE  GRA
---------- ---------- ---------- ---------- ---------- ---
DATAENTRY  SCOTT      EMP                   INSERT     NO
DATAENTRY  SCOTT      EMP                   SELECT     NO
DATAENTRY  SCOTT      EMP                   UPDATE     NO

SQL>

如果你想以特权用户的身份进行这样的查询,那么它是dba_tab_privs

SQL> show user
USER is "SYS"
SQL> select * From dba_tab_privs where owner = 'SCOTT';

GRANTEE      OWNER      TABLE_NAME GRANTOR    PRIVILEGE  GRA HIE
------------ ---------- ---------- ---------- ---------- --- ---
MIKE         SCOTT      DEPT       SCOTT      DELETE     YES NO
DATAENTRY    SCOTT      EMP        SCOTT      INSERT     NO  NO
DATAENTRY    SCOTT      EMP        SCOTT      SELECT     NO  NO
DATAENTRY    SCOTT      EMP        SCOTT      UPDATE     NO  NO

SQL>

【讨论】:

你可以,但你不会得到任何东西,因为它是 ROLE_TAB_PRIVS(不是“PRIVES”),并且角色名称应该是大写的:WHERE ROLE = 'DATAENTRY'【参考方案2】:

由于您标记了 SQLDev...打开查看菜单,选择 DBA。

添加您的连接。展开,转到安全,选择角色,打开您的角色。

观察 Object Privs 面板。

SQL Developer 使用此 SQL 获取角色的对象权限

SELECT privilege   AS "Object Privilege"
     , owner       AS "Schema"
     , table_name  AS "Object"
  FROM dba_tab_privs
 WHERE grantee = :name -- DATAENTRY
 ORDER BY 2
        , 3
        , 1

【讨论】:

以上是关于在 Oracle 中找不到分配给已创建角色的权限的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.6 中找不到 Trait 'App\HasRoles' 错误

oracle权限的分配与回收

创建权限并在模块安装时为其设置角色

那我用SQL创建表之后,为啥在所创建的数据库中找不到呢?

oracle 10g中权限分配问题 对于角色CONNECT,RESOURCE的权限我查看了, 我赋予一个用户这两个角色。

IDW10201:在不记名令牌中找不到范围或角色声明