目录
1. CDB 授权不带 container 默认
2. CDB 授权带 container=all
3. CDB 授权带 container=current
4. PDB 授权不带 container 默认
5. PDB 授权带 container=all
6. PDB 授权带 container=current
1. CDB 授权不带 container 默认
CDB创建测试用户
SQL> create user c##admin identified byadmin;Usercreated.
# 需要注意:CDB级别中这个语句和带 container=all 语句效果一样
SQL> select username,common,con_id from cdb_users where username='C##ADMIN';
USERNAME COMMON CON_ID--------------- ------ ----------
C##ADMIN YES 1C##ADMIN YES3
对该用户进行授权,不带 container 子句
SQL> grant create session toc##admin;Grantsucceeded.
# 授权成功后,请问 c##admin 用户能否登陆CDB?能否登陆PDB?
验证该用户是否可以登录CDB和PDB
SQL> conn c##admin/admin@cdb18cConnected.
# CDB可以进行登录
SQL> conn c##admin/admin@ordersERROR:
ORA-01045: user C##ADMIN lacks CREATESESSION privilege; logon denied
Warning: You are no longer connectedtoORACLE.
# PDB无法进行登录
结论:公共用户在进行授权不带 container 子句,默认仅作用于CDB级别。
2. CDB 授权带 container=all
CDB创建测试用户
SQL> conn / assysdba
Connected.
SQL> create user c##admin1 identified byadmin1;User created.
该语句创建的用户,将作用于CDB和所有PDB。
SQL> select username,common,con_id from cdb_users where username='C##ADMIN1';
USERNAME COMMON CON_ID--------------- ------ ----------
C##ADMIN1 YES 1C##ADMIN1 YES3
对该用户进行授权,带 container=all 子句
SQL> grant create session to c##admin1 container=all;Grant succeeded.
验证该用户是否可以登录CDB和PDB
SQL> conn c##admin1/admin1@cdb18cConnected.
# CDB可以进行登录
SQL> conn c##admin1/admin1@ordersConnected.
# PDB可以进行登录
结论:公共用户在进行授权带 container=all 子句,默认作用于CDB和所有PDB。
3. CDB 授权带 container=current
CDB创建测试用户
SQL> conn / assysdba
Connected.
SQL> create user c##admin2 identified byadmin2;User created.
该语句创建的用户,将作用于CDB和所有PDB。
SQL> select username,common,con_id from cdb_users where username='C##ADMIN2';
USERNAME COMMON CON_ID--------------- ------ ----------
C##ADMIN2 YES 1C##ADMIN2 YES3
对该用户进行授权,带 container=current 子句
SQL> grant create session to c##admin2 container=current;Grant succeeded.
验证该用户是否可以登录CDB和PDB
SQL> conn c##admin2/admin2@cdb18cConnected.
# CDB可以进行登录
SQL> conn c##admin2/admin2@ordersERROR:
ORA-01045: user C##ADMIN2 lacks CREATESESSION privilege; logon denied
Warning: You are no longer connectedtoORACLE.
# PDB无法进行登录
结论:公共用户在进行授权带 container=current 子句,默认仅作用于CDB级别,和不带container子句效果一致。
4. PDB 授权不带 container 默认
PDB创建测试用户
SQL> conn sys/oracle@orders assysdba
Connected.
SQL>show pdbs
CON_ID CON_NAMEOPENMODE RESTRICTED---------- ------------------- ---------- ----------
3 ORDERS READWRITE NO
SQL> create user padmin identified bypadmin;User created.
该语句创建的用户,将作用于当前PDB。
SQL> select username,common,con_id from cdb_users where username='PADMIN';
USERNAME COMMON CON_ID--------------- ------ ----------
PADMIN NO 3
对该用户进行授权,不带 container 子句
SQL> grant create session topadmin;Grant succeeded.
验证该用户是否可以登录当前PDB
SQL> conn padmin/padmin@ordersConnected.
# PDB可以进行登录
结论:本地用户在进行授权不带 container 子句,默认仅作用于当前PDB级别。
5. PDB 授权带 container=all
PDB创建测试用户
SQL> create user padmin1 identified bypadmin1;User created.
该语句创建的用户,将作用于当前PDB。
SQL> select username,common,con_id from cdb_users where username='PADMIN1';
USERNAME COMMON CON_ID---------- ------ ----------
PADMIN1 NO 3
对该用户进行授权,带 container=all 子句
SQL> grant create session to padmin1 container=all;grant create session to padmin1 container=all
*ERROR at line1:
ORA-65030: cannot grant a privilege commonly to a local user orrole
# 报错,无法进行本地用户的 container=all 授权
结论:本地用户在进行权限授权时,无法使用 container=all 子句。
6. PDB 授权带 container=current
针对上面PDB用户 padmin1 能否使用 container=current 子句进行授权?
SQL> grant create session to padmin1 container=current;Grantsucceeded.
SQL> conn padmin1/padmin1@ordersConnected.
结论:本地用户在进行权限授权时,使用container=current子句,作用域为当前PDB。
综上:
1. 在CDB级别中对用户进行授权,不带 container 子句的效果: 仅作用于当前CDB
2. 在CDB级别中对用户进行授权,带 container=all 子句的效果:作用于当前CDB和所有PDB
3. 在CDB级别中对用户进行授权,带 container=current 子句的效果:仅作用于当前CDB
4. 在PDB级别中对用户进行授权,不带 container 子句的效果:仅作用于当前PDB
5. 在PDB级别中对用户进行授权,带 container=all 子句的效果:X错误X PDB级别不能使用 ALL
6. 在PDB级别中对用户进行授权,带 container=current 子句的效果:仅作用于当前PDB