Oracle12c多租户管理用户、角色、权限
Oracle 数据库 12 c 多租户选项允许单个容器数据库 (CDB) 来承载多个单独的可插拔数据库 (PDB)。
那么我们如何在容器数据库 (CDB) 和可插拔数据库 (PDB)管理用户权限。
背景:
当连接到多租户的数据库中,用户权限的管理相对传统的 Oracle 单数据库环境稍有不同。在多租户环境中有两种类型的用户。
共同用户(Common User): 该用户存在所有容器 (根和所有的 Pdb) 中。
本地用户(Local User): 用户只有在特定的 PDB 中存在。同样的用户名中可以存在多个Pdb中创建,但它们之间没有关系。
同样,有两种类型的角色。
共同角色(Common Role): 该角色在所有容器 (根和所有的 Pdb) 中。
本地角色(Local Role): 该角色只存在于特定的 PDB。可以在多个 Pdb中创建相同的角色名称,但它们之间没有关系。
一些 DDL 语句有扩充,以使他们能够定向到当前容器还是所有容器的CONTAINER子句。它的使用将在以下各节中进行演示。
一、创建和共同用户
条件:
1.必须连接到具有CREATE USER特权的共同用户。
2.在当前的数据库必须是根容器数据库。
3.常见的用户的用户名必须与"C##"或"c##"作为前缀,并包含唯一的 ASCII 或 EBCDIC 字符。
4.在所有容器该共同用户名必须是唯一的。
5.DEFAULT TABLESPACE、TEMPORARY TABLESPACE、QUOTA和PROFILE必须存在于所有容器中的所有引用对象。
您可以指定CONTAINER=ALL子句,或者忽略它,因为这是默认设置时,当前的容器是根。
6.公共用户可以在不同的CDB、PDB数据库中有不同的权限。
操作:
在 cdb 中创建公共用户的时候, pdbs 中也会创建相同用户。若CDB 下 GRANT 命令赋权,如果赋权时未指定container=all,则赋权只在CDB中生效,并不会在PDB中生效,这个用户要能够访问PDB,需要切换到 pdb 再赋权。。若赋权时指定 container=all,则赋权在CDB中生效,也在PDB中生效。
赋权时未指定container=all:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##andy02 identified by andy;
SQL> grant create session to c##andy02;
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/andycdb
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
ERROR:
ORA-01045: user C##ANDY02 lacks CREATE SESSION privilege; logon denied
SQL> alter session set container=pdb01;
SQL> grant create session to c##andy02;
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
赋权时指定container=all:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##andy identified by andy;
SQL> grant create session to c##andy container=all;
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
二、创建本地用户
条件:
1.必须连接到具有CREATE USER特权的用户。
2.本地用户的用户名不必须与"C##"或"c##"作为前缀。
3.用户名必须是在 PDB 内是唯一的。
4.当前的容器是 PDB 的时候,您可以指定CONTAINER=CURRENT子句,或者忽略它,因为这是默认设置。
操作:
SQL> show con_name
CON_NAME
------------------------------
PDB01
SQL> create user andy identified by andy;
SQL> grant create session to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
-- 去 CDB 中查看 本地用户 ANDY 存在否,果真不存在。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select username,created from dba_users where username='ANDY';
no rows selected
三、创建共同角色
类似于前面所述的用户,角色可以是共同的或本地的 。
Oracle 提供的所有角色在根容器中和所有的 Pdb可见。创建共同角色需要满足以下条件。
条件
1.必须连接到共同用户CREATE ROLE与通常授予的SET CONTAINER权限。
2.当前的容器必须是根容器。
3.常见角色的角色名称必须与"C##"或"c##"为前缀,并且包含唯一 ASCII 或 EBCDIC 字符。
4.在所有容器的角色名称必须是唯一的。
5.角色创建与CONTAINER=ALL子句
6.公共角色可以赋予公共用户或者本地用户
操作:
注意:在 CDB 赋予角色权限的时候,需要指定 container=all ,否则 PDB 中不可见。
SQL> show con_name
CON_NAME
-------------------
CDB$ROOT
SQL> create role c##role_andy;
公共角色赋权 To a common user:
SQL> grant select on dba_objects to c##role_andy container=all;
SQL> grant c##role_andy to c##andy container=all;
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
SQL>
set lin 300;
set pagesize 300;
col username for a30;
col granted_role for a30;
select * from USER_ROLE_PRIVS;
USERNAME GRANTED_ROLE ADM DEL DEF OS_ COM INH
------------------------------ ------------------------------ --- --- --- --- --- ---
C##ANDY C##ROLE_ANDY NO NO YES NO YES NO
SQL> select count(*) from dba_objects;
COUNT(*)
----------
72635
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
set lin 300;
set pagesize 300;
col username for a30;
col granted_role for a30;
select * from USER_ROLE_PRIVS;
USERNAME GRANTED_ROLE ADM DEL DEF OS_ COM INH
------------------------------ ------------------------------ --- --- --- --- --- ---
C##ANDY C##ROLE_ANDY NO NO YES NO YES YES
SQL> select count(*) from dba_objects;
COUNT(*)
----------
72629
公共角色赋权 To a local user:
SQL> alter session set container=pdb01;
SQL> grant c##role_andy to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_objects;
COUNT(*)
----------
72629
四、创建本地角色
本地角色是以类似的方式到 pre-12 c 数据库创建的。每个 PDB 可以具有与匹配的名称,因为当地的作用范围仅限于当前 PDB 的角色。
必须满足以下条件。
条件:
1.必须连接到具有CREATE ROLE权限的用户。
2.如果您连接到公共用户,容器必须设置为本地 PDB。
3.角色名称为本地角色不必须与"C##"或"c##"作为前缀。
4.角色名称必须是唯一在 PDB 内。
5.本地角色可以赋权给公共用户(作用范围局限于pdb内操作,不影响CDB权限)或者本地用户。
操作:
SQL> alter session set container=pdb01;
create role pdb_role;
grant select on dba_tables to pdb_role;
本地角色赋权 To a common user:
grant pdb_role to c##andy;
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_tables;
COUNT(*)
----------
2106
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
SQL> select count(*) from dba_tables;
select count(*) from dba_tables
*
ERROR at line 1:
ORA-00942: table or view does not exist
本地角色赋权 To a local user:
grant pdb_role to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_tables;
COUNT(*)
----------
2106
Oracle12c多租户管理用户、角色、权限的更多相关文章
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10
今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...
- [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity
项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- spring-boot-plus V1.4.0发布 集成用户角色权限部门管理
RBAC用户角色权限 用户角色权限部门管理核心接口介绍 Shiro权限配置
- java权限管理与用户角色权限设计
java权限管理与用户角色权限设计 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器 ...
- [转]扩展RBAC用户角色权限设计方案
原文地址:http://www.iteye.com/topic/930648 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地 ...
- 扩展RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用 户-角色 ...
随机推荐
- spdlog源码阅读 (3): log_msg和BasicWriter
4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...
- JavaScript对象原型写法区别
体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Pers ...
- 彻底理解容器类(2)------- AbstractCollection深入了解
h2 { background-color: Skyblue } AbstractCollection认识 AbstractCollection是Collection接口的抽象实现.实现了一部分Col ...
- 老李回答:JAVA程序的性能测试方法
Java 1.5以上都在虚拟机里内建了程序性能跟踪的功能,并提供了Java Profiling API,简称JPA,你可以搜索'java profiling'.Java也提供了简单的性能性能跟踪工具J ...
- 手机自动化测试:Appium源码分析之跟踪代码分析九
手机自动化测试:Appium源码分析之跟踪代码分析九 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- Fragment深入解析
写在顶部表示这点很重要: 本文转载自博客:http://blog.csdn.net/lmj623565791/article/details/37970961 欢迎访问原文 自从Fragment ...
- Java并发编程:如何创建进程?
转载自:http://www.cnblogs.com/dolphin0520/p/3913517.html 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程 ...
- 第一个python爬虫程序
1.安装Python环境 官网https://www.python.org/下载与操作系统匹配的安装程序,安装并配置环境变量 2.IntelliJ Idea安装Python插件 我用的idea,在工具 ...
- grep的用法笔记
1.grep搜索不保护字符串的命令格式如下: #带-v参数 jevan@df ~ grep "agc" -vRn ./
- iOS 检测文本中的 URL、电话号码等信息
iOS 检测文本中的 URL.电话号码等信息 要检测文本中的 URL.电话号码等,除了用正则表达式,还可以用 NSDataDetector. 用 NSTextCheckingResult.Checki ...