本篇探討以下幾個問題:你可提前猜測下面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