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,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用 户-角色 ...
随机推荐
- 配置uwsgi
首先要明确的是,如果你喜欢用命令行的方式(如shell)敲命令,那可以省去任何配置. 但是,绝大多数人,还是不愿意记那么长的命令,反复敲的.所以uwsgi里,就给大家提供了多种配置,省去你启动时候,需 ...
- trimpath javascript的学习
TrimPath是javascript模板引擎. 这几天有一个项目涉及到trimpath这个框架,所以就花了一点时间研究了一下,这个框架和别的javascript框架不太一样的地方就是模板的概念,就是 ...
- pyqt样式表语法笔记(上) --原创
pyqt样式表语法笔记(上) pyqt QSS python 样式表 因为软件课设的原因开始学习使用pyqt4,才发现原来它也有样式表,而且语法跟css基本相同,而且一些功能实现起来感觉比js要简单方 ...
- 参加光环国际PRINCE2培训
挑战埃及是全球首套能够同时适配PRINCE2认证人群,PMP认证人群的项目管理沙盘演练游戏.沙盘通过使用乐高积木作为道具,通过一场互动性极强的情景模拟为全球项目经理还原了四千年前古埃及金字塔建造的情景 ...
- oracle查询锁表解锁语句
--oracle查询锁表解锁语句--首先要用dba权限的用户登录,建议用system,然后直接看sql吧 --1. 如下语句 查询锁定的表: SELECT l.session_id sid, s.se ...
- Xamarin+Prism开发之.net standard化
前面[Visual Studio 2017创建.net standard类库编译出错原因]已经解决.net standard类库的编译问题,现在可以正式进入主题了.作为.net 跨平台开发者也得跟上时 ...
- js实现多行图片点击(自动)左右无缝轮播特效
/*效果图*/ HTML: <div class="scroll"> <div class="picbox"> ...
- poj 3270 Cow Sorting (置换入门)
题意:给你一个无序数列,让你两两交换将其排成一个非递减的序列,每次交换的花费交换的两个数之和,问你最小的花费 思路:首先了解一下什么是置换,置换即定义S = {1,...,n}到其自身的一个双射函数f ...
- rxjava2学习笔记(1)
1.什么是RxJava? 简单,清晰的多线程编程框架.可方便的写出维护性高,逻辑清晰的Java程序. 2.什么是观察者模式? 入门教程讲这种高大上抽象概念都是耍流氓! 3.开始 3.1github地址 ...
- 浅析Java中synchronized与static synchronized
synchronized关键字 synchronized是进行同步处理而保证线程安全.在一个方法中,如果是方法内的私有变量,那个这个变量是线程安全的,但是类中的实例变量是可能会出现线程安全问题的,当多 ...