Oracle 12c多租户新特性:Common用户和Local用户的管理
编辑手记:这一节我们将介绍多租户架构中用户及权限的变化,全局用户和本地用户,管理方式和内部实现,这篇文章来自一书的摘录。云和恩墨 的很多客户已经采用多租户特性进行生产部署,这一技术早已经走入实践。
无论在CDB和Non-CDB数据库中,用户都拥有一个Schema,拥有一系列的Schema对象,在CDB中由于PDB的引入,用户范畴有所不同。
在CDB模式下,公用用户(Common User)和本地用户(Local User)两个概念被引入进来,公用用户可以在CDB和PDB中同时存在,能够连接ROOT和PDB进行操作;而本地用户则只在特定的PDB中存在,也只能在特定的PDB中执行操作;在PDB中不能创建公用用户,而在CDB中(CDB$ROOT中)同样不能创建本地用户。
在CDB中创建的公用用户要求以c##或C## 开头,以下测试以常规方式命名的用户将会创建失败,符合规则的用户可以被创建:
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
SQL> create user eygle identified by eygle;
create user eygle identified by eygle
*
第 1 行出现错误:
ORA-65096: 公用用户名或角色名无效
SQL> create user c##eygle identified by eygle;
用户已创建。
当创建公用用户时,Oracle会向每个PDB中同时创建该用户,如果PDB未打开,则创建工作会以任务的方式延后。
以下查询显示数据库中只在容器1中存在新创建的用户:
SQL> select username,common,con_id from cdb_users where username like '%EYGLE%';
USERNAME COM CON_ID
------------------------------ --- ----------
C##EYGLE YES 1
此时打开PDB,则数据库会自动完成之前挂起的内部创建工作:
SQL> alter pluggable database enmo open;
插接式数据库已变更。
SQL> select username,common,con_id from cdb_users where username like '%EYGLE%';
USERNAME COM CON_ID
------------------------------ --- ----------
C##EYGLE YES 1
C##EYGLE YES 3
SQL> drop user c##eygle;
用户已删除。
下图描述了公用用户和本地用户的区别:
在拥有了CREATE SESSION权限后,公用用户能够登陆包括Root在内的任何Container。公用用户一般在每个PDB中都存在对应的用户信息,在PDB中不能存在与公用用户重名的用户,如初始的SYS和SYSTEM用户都属于公用用户。也只有公用用户能够授权或被授权相应的公用角色和权限。
公用权限是指对所有Container都有效的系统或者对象权限,例如一个公用用户被授予了公用权限 CREATE ANY TABLE WITH ADMIN OPTION 可以将这个权限转授给其他公用用户.公用用户之外的权限被称为本地权限(Local Privilege).
公用角色是指在所有Container中都可见的角色,这些角色可能包含全局和本地权限。本地角色只能包含本地权限。授予公用角色的公用权限,对于具有该角色的用户在任何可以连接的Container中都将具有该权限。
以下是