本篇探討以下幾個問題:你可提前猜測下面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級別創建的用戶或角色稱為本地用戶或角色。且CDB級別無法對公共用戶和角色無法進行 container=current 操作,PDB級別無法對本地用戶進行 container=all 操作。
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 user c##admin identified by admin; User created. # 需要注意:CDB級別中這個語句和帶 container=all 語句效果一樣
該語句創建的用戶,將作用於CDB和所有PDB。詳情參考《理解 Oracle 多租戶體系中(12c,18c,19c)創建用戶作用域范圍》一文
SQL> select username,common,con_id from cdb_users where username='C##ADMIN'; USERNAME COMMON CON_ID --------------- ------ ---------- C##ADMIN YES 1 C##ADMIN YES 3
對該用戶進行授權,不帶 container 子句
SQL> grant create session to c##admin; Grant succeeded. # 授權成功后,請問 c##admin 用戶能否登陸CDB?能否登陸PDB?
驗證該用戶是否可以登錄CDB和PDB
SQL> conn c##admin/admin@cdb18c Connected. # CDB可以進行登錄 SQL> conn c##admin/admin@orders ERROR: ORA-01045: user C##ADMIN lacks CREATE SESSION privilege; logon denied Warning: You are no longer connected to ORACLE. # PDB無法進行登錄
結論:公共用戶在進行授權不帶 container 子句,默認僅作用於CDB級別。
2. CDB 授權帶 container=all
CDB創建測試用戶
SQL> conn / as sysdba Connected. SQL> create user c##admin1 identified by admin1; User created.
該語句創建的用戶,將作用於CDB和所有PDB。
SQL> select username,common,con_id from cdb_users where username='C##ADMIN1'; USERNAME COMMON CON_ID --------------- ------ ---------- C##ADMIN1 YES 1 C##ADMIN1 YES 3
對該用戶進行授權,帶 container=all 子句
SQL> grant create session to c##admin1 container=all; Grant succeeded.
驗證該用戶是否可以登錄CDB和PDB
SQL> conn c##admin1/admin1@cdb18c Connected. # CDB可以進行登錄 SQL> conn c##admin1/admin1@orders Connected. # PDB可以進行登錄
結論:公共用戶在進行授權帶 container=all 子句,默認作用於CDB和所有PDB。
3. CDB 授權帶 container=current
CDB創建測試用戶
SQL> conn / as sysdba Connected. SQL> create user c##admin2 identified by admin2; User created.
該語句創建的用戶,將作用於CDB和所有PDB。
SQL> select username,common,con_id from cdb_users where username='C##ADMIN2'; USERNAME COMMON CON_ID --------------- ------ ---------- C##ADMIN2 YES 1 C##ADMIN2 YES 3
對該用戶進行授權,帶 container=current 子句
SQL> grant create session to c##admin2 container=current; Grant succeeded.
驗證該用戶是否可以登錄CDB和PDB
SQL> conn c##admin2/admin2@cdb18c Connected. # CDB可以進行登錄 SQL> conn c##admin2/admin2@orders ERROR: ORA-01045: user C##ADMIN2 lacks CREATE SESSION privilege; logon denied Warning: You are no longer connected to ORACLE. # PDB無法進行登錄
結論:公共用戶在進行授權帶 container=current 子句,默認僅作用於CDB級別,和不帶container子句效果一致。
4. PDB 授權不帶 container 默認
PDB創建測試用戶
SQL> conn sys/oracle@orders as sysdba Connected. SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------- ---------- ---------- 3 ORDERS READ WRITE NO
SQL> create user padmin identified by padmin; 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 to padmin; Grant succeeded.
驗證該用戶是否可以登錄當前PDB
SQL> conn padmin/padmin@orders Connected.
# PDB可以進行登錄
結論:本地用戶在進行授權不帶 container 子句,默認僅作用於當前PDB級別。
5. PDB 授權帶 container=all
PDB創建測試用戶
SQL> create user padmin1 identified by padmin1; 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 line 1: ORA-65030: cannot grant a privilege commonly to a local user or role # 報錯,無法進行本地用戶的 container=all 授權
結論:本地用戶在進行權限授權時,無法使用 container=all 子句。
6. PDB 授權帶 container=current
針對上面PDB用戶 padmin1 能否使用 container=current 子句進行授權?
SQL> grant create session to padmin1 container=current; Grant succeeded. SQL> conn padmin1/padmin1@orders Connected.
結論:本地用戶在進行權限授權時,使用 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