理解 Oracle 多租戶體系中(12c,18c,19c)創建用戶作用域范圍


本篇探討以下幾個問題:你可提前猜測下面6個場景語句中,哪幾個可以成功創建用戶?

1. 在CDB級別中創建公共用戶,不帶 container 子句的效果;

2. 在CDB級別中創建公共用戶,帶 container=all 子句的效果;

3. 在CDB級別中創建公共用戶,帶 container=current 子句的效果;

4. 在PDB級別中創建本地用戶,不帶 container 子句的效果;

5. 在PDB級別中創建本地用戶,帶 container=all 子句的效果;

6. 在PDB級別中創建本地用戶,帶 container=current 子句的效果;

在理解上面問題之前,我們需要提前約定,就是需要提前知道:

1. CDB級別創建的用戶稱為公共用戶PDB級別創建的用戶稱為本地用戶

2. 公共用戶和角色命名規則對應參數 common_user_prefix ,該參數值默認為 C##。所以,在CDB級別創建公共用戶或角色,需要帶 C##(也可以更改參數值,但不建議)。

3. PDB$SEED 僅為種子容器,對應 CON_ID 為 2,只讀模式,不參與討論。

演示數據庫版本:18.3.0.0.0(18c)

 

目錄

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 默認

SQL> show con_id

CON_ID
------------------------------
1

SQL> create user c##cabc1 identified by cabc1;

User created.

SQL> select username,con_id from cdb_users where username='C##CABC1';

USERNAME   CON_ID
---------- ------
C##CABC1    1
C##CABC1    3

所以,CDB級別創建公共用戶,不帶container子句,默認作用域范圍:CDB和所有PDB

 

2. CDB帶 container=all

SQL> show con_id

CON_ID
------------------------------
1

SQL> create user c##cabc2 identified by cabc2 container=all;

User created.

SQL> select username,con_id from cdb_users where username='C##CABC2';

USERNAME   CON_ID
---------- ------
C##CABC2    1
C##CABC2    3

所以,CDB級別創建公共用戶,帶container=all子句,默認作用域范圍:CDB和所有PDB。和不帶效果一樣。

 

3. CDB帶 container=current

SQL> show con_id

CON_ID
------------------------------
1

SQL> create user c##cabc3 identified by cabc3 container=current;
create user c##cabc3 identified by cabc3 container=current
            *
ERROR at line 1:
ORA-65094: invalid local user or role name

所以,CDB級別創建公共用戶,不能帶 container=current 。因為是公共用戶,默認作用於CDB及整個PDB。

 

4. PDB不帶 container 默認

SQL> alter session set container=orders;

Session altered.

SQL> create user pdbabc1 identified by pdbabc1;

User created.

SQL> select username,con_id from cdb_users where username='PDBABC1';

USERNAME   CON_ID
---------- ------
PDBABC1     3

所以,PDB級別創建本地用戶,不帶container子句,默認作用域范圍:當前PDB

 

5. PDB帶 container=all 

SQL> create user pdbabc2 identified by pdbabc2 container=all;
create user pdbabc2 identified by pdbabc2 container=all
*
ERROR at line 1:
ORA-65050: Common DDLs only allowed in root.

所以,PDB級別創建本地用戶,無法使用 container=all 子句。

 

6. PDB帶 container=current 

SQL> create user pdbabc3 identified by pdbabc3 container=current;

User created.

SQL> select username,con_id from cdb_users where username='PDBABC3';

USERNAME   CON_ID
---------- ------
PDBABC3     3

所以,PDB級別創建本地用戶,帶 container=current,作用域范圍:當前PDB。

 

綜上:

1. 在CDB級別中創建公共用戶,不帶 container 子句的效果: 作用於當前CDB和所有PDB

2. 在CDB級別中創建公共用戶,帶 container=all 子句的效果:作用於當前CDB和所有PDB

3. 在CDB級別中創建公共用戶,帶 container=current 子句的效果:X錯誤X CDB級別不能使用 CURRENT

4. 在PDB級別中創建本地用戶,不帶 container 子句的效果:作用於當前PDB

5. 在PDB級別中創建本地用戶,帶 container=all 子句的效果:X錯誤X PDB級別不能使用 ALL

6. 在PDB級別中創建本地用戶,帶 container=current 子句的效果:作用於當前PDB


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM