完成目标:在oracle 12c下创建用户test_user,默认表空间为test_cdb
首先在cdb模式下新建表空间
SQL> create tablespace test_cdb datafile '/app/oracle/oradata/orcl/cdb_tbs_01.dbf' size 20m;
Tablespace created.
ok,这里创建成功,接下来创建用户test_user指定默认表空间为 test_cdb
SQL> create user test_user identified by 123456 default tablespace test_cdb;
create user test_user identified by 123456 default tablespace test_cdb
*
ERROR at line 1:
ORA-65096: 公用用户名或角色名无效
嗯,不好意思,忘记用户名称前要加c##或者C##,12c与11g创建用户有所区别哦,12c如果在pdb下和11g创建用户命令一致,在cdb容器下创建用户要加c##,注意了哈,这里也给大家提个醒,嗯,再次修改执行
SQL> create user c##test_user identified by 123456 default tablespace test_cdb;
create user c##test_user identified by 123456 default tablespace test_cdb
*
ERROR at line 1:
ORA-65048: 在可插入数据库 PDB1 中处理当前 DDL 语句时出错 ORA-00959: 表空间
'TEST_CDB' 不存在
又报错,提示我的表空间不存在,不可能的啊,刚才明明创建成功,截图为证了,这里不要心急,不要慌,看ORA-65048的错误内容:【在可插入数据库pdb1
............出错】,查看官方文档,有段话这么说的:
While creating a common user, any default tablespace, temporary tablespace, or profile specified using the following clauses must exist in all the containers belonging to the CDB:
DEFAULT TABLESPACE
TEMPORARY TABLESPACE
QUOTA
PROFILE
If these objects do not exist in all the containers, the CREATE USER statement fails.
在CDB下给用户分配表空间时,此表空间必须在没有pdb的情况或者pdb下有相同表空间名称的时候才能成功
查看下我的pdb
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
SQL>
2个pdb,本来偷懒打算在一个pdb下创建test_cdb表空间,但是还是报错,报错内容大意就是pdb2下没有test_cdb的表空间对象,后来在两个pdb都创建了才成功,代码如下
SQL> alter session set container=pdb1;
Session altered.
SQL> create tablespace test_cdb datafile '/app/oracle/oradata/orcl/pdb_tbs_01.dbf' size 2m;
Tablespace created.
SQL> alter session set container=cdb$root; --回到CDB容器
Session altered.
SQL> create user c##test_user identified by 123456 default tablespace test_cdb;
create user c##test_user identified by 123456 default tablespace test_cdb
*
ERROR at line 1:
ORA-65048: 在可插入数据库 PDB2 中处理当前 DDL 语句时出错 ORA-00959: 表空间
'TEST_CDB' 不存在
SQL> alter session set container=pdb2;
Session altered.
SQL> create tablespace test_cdb datafile '/app/oracle/oradata/orcl/pdb2_tbs_01.dbf' size 2m;
Tablespace created.
SQL> alter session set container=cdb$root;--回到CDB容器
Session altered.
SQL> create user c##test_user identified by 123456 default tablespace test_cdb;
User created.
总结:如果各位小伙伴也使用了ORACLE 12C,而且PDB非常多的情况下就不要在CDB下指定自己创建的表空间了,使用系统表空间比较好,而且在CDB容器下创建的用户属于公有用户,视情况而定
祝愿每天进步一点点