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


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


免責聲明!

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



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