本篇探討以下幾個問題:你可提前猜測下面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 默認
首先,CDB創建公共角色,如果沒有帶前綴,將報錯
SQL> create role crole1; create role crole1 * ERROR at line 1: ORA-65096: invalid common user or role name
創建不帶任何子句的公共角色
SQL> create role c##crole1; Role created. SQL> set linesize 200 SQL> col role for a20 SQL> select role,common,con_id from cdb_roles where role='C##CROLE1'; ROLE COMMON CON_ID -------------------- ------ ---------- C##CROLE1 YES 1 C##CROLE1 YES 3
結果作用域范圍是:當前CDB和所有PDB生效。
2. CDB帶 container=all
SQL> create role c##crole2 container=all; Role created. SQL> select role,common,con_id from cdb_roles where role='C##CROLE2'; ROLE COMMON CON_ID -------------------- ------ ---------- C##CROLE2 YES 1 C##CROLE2 YES 3
結果作用域范圍是:當前CDB和所有PDB生效。和不帶子句效果一致。
3. CDB帶 container=current
SQL> create role c##crole3 container=current; create role c##crole3 container=current * ERROR at line 1: ORA-65094: invalid local user or role name
結果作用域范圍是:報錯,公共角色無法進行本地創建。
4. PDB不帶 container 默認
首先,PDB級別在本地能否創建以c##前綴開頭的公共角色?
SQL> alter session set container=orders; Session altered. SQL> create role c##crole4; create role c##crole4 * ERROR at line 1: ORA-65094: invalid local user or role name
結果作用域范圍是:報錯,PDB級別是無法創建公共角色的。
SQL> create role prole1; Role created. SQL> select role,common,con_id from cdb_roles where role='PROLE1'; ROLE COMMON CON_ID -------------------- ------ ---------- PROLE1 NO 3
結果作用域范圍是:僅當前PDB級別生效。
5. PDB帶 container=all
SQL> create role prole2 container=all; create role prole2 container=all * ERROR at line 1: ORA-65050: Common DDLs only allowed in root.
結果作用域范圍是:報錯,PDB本地數據庫中是無法通過 container=all 創建角色的。
6. PDB帶 container=current
SQL> create role prole2 container=current; Role created. SQL> select role,common,con_id from cdb_roles where role='PROLE2'; ROLE COMMON CON_ID -------------------- ------ ---------- PROLE2 NO 3
結果作用域范圍是:僅當前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