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

首先,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


免責聲明!

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



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