oracle 多租户 用户,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

补充:

容器数据库创建新用户并分配表空间时必须在没有PDB的情况下进行或PDB与CDB有相同的表空间的时候进行,否则会报错。如果是在PDB与CDB 有相同表空间的情况下给CDB用户分配表空间,则分配CDB的表空间给用户PDB的表空间并不受影响。而且,CDB用户必须以‘C##’为开头,否则创 建不了。

SQL> create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01;

create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01

*

ERROR at line 1:

ORA-65048: error encountered when processing the current DDL statement in

pluggable database PDB01

ORA-00959: tablespace 'CDB_USERS' does not exist

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值