oracle 中 关于角色的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 中 关于角色的问题相关的知识,希望对你有一定的参考价值。

学 oracle 11.2g 学到角色这章遇到个问题:

1.创建角色时,不设置密码; 这种情况下,都能理解

2.创建角色时,给角色设置了密码;(情况如下)

创建用户: create user user01 identified by 123456;

创建角色: create role role01 identified by 123;

DBA用户 sys 给角色授权: grant create session to role01;
DBA用户 sys 将角色授权于用户: grant role01 to user01;

现在用 user01 连接数据库: connect user01/123456
连接失败:提示 ERROR: ORA-01045: user USER01 lacks CREATE SESSION privilege; logon denied

...

下面给出查询相关数据字典的结果:

sys 用户下 查询 role_sys_privs : select * from role_sys_privs where role='ROLE01';
ROLE PRIVILEGE ADM
ROLE01 CREATE SESSION NO

sys 用户下 查询 dba_role_privs: select * from dba_role_privs where grantee='USER01';
GRANTEE GRANTED_ROLE ADM DEF
USER01 ROLE01 NO YES

现在用 sys用户 给 user01 授权: grant create session to user01; (为了连接数据库)
然后用 user01 连接数据库:connect user01/123456

user01用户下 查询 user_role_privs: select * from user_role_privs;

GRANTEE GRANTED_ROLE ADM DEF OS_
USER01 ROLE01 NO NO NO

从上面几个查询结果可以发现:

sys 下查询 dba_role_privs 发现 用户USER01 的 DEF列为 YES
user01 下查询 user_role_privs 发现用户 USER01的 DEF列为 NO

这里问一下 两种情况下的区别???

如果创建角色 ROLE01 时,没有设置密码时,上述情况下 USER01 的 DEF 列都为 YES

麻烦问一下,这个怎么解释呢???
对于 longrenying 的回答,首先谢谢!
下面我再给出一个查询结果: sys用户下查询
select * from dba_role_privs where granted_role ='ROLE01'; 结果如下
GRANTEE GRANTED_ROLE ADM DEF
SYS ROLE01 YES YES
USER01 ROLE01 NO YES

你说的 sys视图中,role01 作为唯一的角色授权,这个应该是对于 创建他的用户 sys 来说的吧,所以他是默认的,这个我也理解,
但对于 角色 role01 授权的用户 user01 为什么 dba视图中显示 DEF 为YES
而在 user视图中却显示为 DEF 为 NO ???

还是说 这两种视图中 DEF 这列表示的含义 不同????

sys视图中:role01作为唯一的角色授权,那么他就是默认的。
user视图中:因为你没有全部继承角色的权限(包括密码),但是你还是授予了这个角色所以就是NO。
你可以尝试创建用户不设置密码,创建角色设置密码,然后把角色授给用户,再用这个用户登录(角色的密码)试试。不过创建角色设置密码,还真是头一次见到追问

文字比较多,麻烦看一下我的问题补充,谢谢

追答

dba视图与sys视图有什么地方不一样?
dba视图更多的考虑全集,而user则只考虑单独一个用户。
个人感觉可能是两者def的解释不同。
dba的视图可能解释为默认的角色。
user的视图则看角色中的每一个权限是否一致,比如你这里就是密码不一致。
这样,你测试一下(我没有环境,以上均为想当然)
你设置两两个角色,权限一致,比如说都是create session的权限,然后一个设置identified,一个不设,然后把两个都授给同一个用户。
用户也设两个,一个设密码,一个不设密码。先都授给设密码的,看看什么情况,再都授给不设密码的看看什么情况。这样大体上能有个参照,这么想我也想不出来什么太好的解释。

追问

嗯嗯 ,谢谢回复
您说的方法我已经测试过 测试结果我在问题中也描述了,可能描述文字太多不直观;
再次谢谢,这个问题先记下,可能慢慢会理解掉的

参考技术A 1该角色允许用户对ORACLE数据进行跟多访问.除了可以赋予connect角色的权限外,它还可以创建触发器和索引权限.
2 在SYSDBA模式下使用SQL语句 drop from 用户名.
3 connect权限 resource权限 DBA权限.
4 revoke connect(resource dba) from 角色名.

坑向: 关于对Oracle数据库新建用户后,进行角色授予GRANT “CONNECT“, “RESOURCE“后,用户仍然没有指定角色的相关权限,致拒绝登录ORA-01045问题的探究

坑向: 关于对Oracle数据库新建用户后,进行角色授予GRANT "CONNECT", "RESOURCE"后,用户仍然没有指定角色的相关权限,致拒绝登录ORA-01045问题的探究

1 环境介绍

windows 7 操作系统
Oracle 11g

2 问题描述

在Oracle数据库连接后,自定义新建用户(BAO)后(此时该用户没有登录数据库的权限),使用 所谓的
GRANT "CONNECT", "RESOURCE" TO "BAO";
即使显示授权成功(或者操作成功后),该新建用户仍然无法登录数据库。
具体错误如下(ORA-01045):

3 原因分析

Oracle角色 可以被理解为可复用的 权限集合。
Oracle角色 被授予给用户(GRANT后),仍然需要多一条语句操作。
即增加:修改用户的默认角色 ALTER USER "BAO" DEFAULT ROLE "CONNECT", "RESOURCE";
(若没有此语句,Oracle会将默认角色仍然设置为NONE,即ALTER USER "BAO" DEFAULT ROLE NONE;导致即使GRANT角色已赋予基本权限成功后,该用户仍然无法登录数据库)

但是权限的授予只需要一条语句, GRANT CREATE SESSION TO "BAO"; 即可。

4 解决办法(以下操作皆已使用DBA身份登录了数据库)

4.1 使用PL/SQL为新建用户授予基本权限以登录Oracle数据库

GRANT "CONNECT", "RESOURCE" TO "BAO";

ALTER USER "BAO" DEFAULT ROLE "CONNECT", "RESOURCE";

4.2 使用OEM(Oracle Enterprise Management)为新建用户授予基本权限以登录Oracle数据库

为BAO用户授予Connect,Resource角色,选择完后确认提交!

注意提交完后确保新建用户下的角色的复选框默认值为勾选状态即可(此处保障了新建用户的角色不会被默认设置为NONE)

4.3 使用Navicat数据库图形管理工具为新建用户授予基本权限以登录Oracle数据库

进入用户角色授予的修改界面(成员属于),选中 授予作为默认 两个复选框
具体如下(仅演示了Connect角色授予,Resource角色授予类似):
可以查看到当选择默认后,在SQL预览中可以发现,新建用户的默认角色也被修改

5 最终结果

在对 授予角色修改默认用户角色后,以新建用户的身份成功登入数据库。

5.1 PL/SQL效果:

5.2 Navicat效果

以上是关于oracle 中 关于角色的问题的主要内容,如果未能解决你的问题,请参考以下文章

坑向: 关于对Oracle数据库新建用户后,进行角色授予GRANT “CONNECT“, “RESOURCE“后,用户仍然没有指定角色的相关权限,致拒绝登录ORA-01045问题的探究

oracle 仅导出和导入用户及其角色

关于Oracle中sysoper这个系统权限的问题

oracle关于同一表空间下的不同用户查询问题

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

oracle 用户角色