Oracle12c多租戶管理使用者、角色、許可權

張衝andy發表於2017-05-06
Oracle 資料庫 12 c 多租戶選項允許單個容器資料庫 (CDB) 來承載多個單獨的可插拔資料庫 (PDB)。
那麼我們如何在容器資料庫 (CDB) 和可插拔資料庫 (PDB)管理使用者許可權。


背景:
當連線到多租戶的資料庫中,使用者許可權的管理相對傳統的 Oracle 單資料庫環境稍有不同。在多租戶環境中有兩種型別的使用者。
共同使用者(Common User): 該使用者存在所有容器 (根和所有的 Pdb) 中。
本地使用者(Local User): 使用者只有在特定的 PDB 中存在。同樣的使用者名稱中可以存在多個Pdb中建立,但它們之間沒有關係。
同樣,有兩種型別的角色。
共同角色(Common Role): 該角色在所有容器 (根和所有的 Pdb) 中。
本地角色(Local Role): 該角色只存在於特定的 PDB。可以在多個 Pdb中建立相同的角色名稱,但它們之間沒有關係。
一些 DDL 語句有擴充,以使他們能夠定向到當前容器還是所有容器的CONTAINER子句。它的使用將在以下各節中進行演示。


一、建立和共同使用者
條件:
1.必須連線到具有CREATE USER特權的共同使用者。
2.在當前的資料庫必須是根容器資料庫。
3.常見的使用者的使用者名稱必須與"C##"或"c##"作為字首,幷包含唯一的 ASCII 或 EBCDIC 字元。
4.在所有容器該共同使用者名稱必須是唯一的。
5.DEFAULT TABLESPACE、TEMPORARY TABLESPACE、QUOTA和PROFILE必須存在於所有容器中的所有引用物件。
您可以指定CONTAINER=ALL子句,或者忽略它,因為這是預設設定時,當前的容器是根。
6.公共使用者可以在不同的CDB、PDB資料庫中有不同的許可權。
操作:
在 cdb 中建立公共使用者的時候, pdbs 中也會建立相同使用者。若CDB 下 GRANT 命令賦權,如果賦權時未指定container=all,則賦權只在CDB中生效,並不會在PDB中生效,這個使用者要能夠訪問PDB,需要切換到 pdb 再賦權。。若賦權時指定 container=all,則賦權在CDB中生效,也在PDB中生效。


賦權時未指定container=all:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##andy02 identified by andy;
SQL> grant create session to c##andy02;
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/andycdb
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
ERROR:
ORA-01045: user C##ANDY02 lacks CREATE SESSION privilege; logon denied
SQL> alter session set container=pdb01;
SQL> grant create session to c##andy02;
C:\Users\andy>sqlplus c##andy02/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


賦權時指定container=all:
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##andy identified by andy;
SQL> grant create session to c##andy container=all;
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


二、建立本地使用者
條件:
1.必須連線到具有CREATE USER特權的使用者。
2.本地使用者的使用者名稱不必須與"C##"或"c##"作為字首。
3.使用者名稱必須是在 PDB 內是唯一的。
4.當前的容器是 PDB 的時候,您可以指定CONTAINER=CURRENT子句,或者忽略它,因為這是預設設定。
操作:
SQL> show con_name
CON_NAME
------------------------------
PDB01
SQL> create user andy identified by andy;
SQL> grant create session to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
-- 去 CDB 中檢視 本地使用者 ANDY 存在否,果真不存在。
SQL> show con_name


CON_NAME
------------------------------
CDB$ROOT
SQL> select username,created from dba_users where username='ANDY';
no rows selected


三、建立共同角色
類似於前面所述的使用者,角色可以是共同的或本地的   。
Oracle 提供的所有角色在根容器中和所有的 Pdb可見。建立共同角色需要滿足以下條件。
條件
1.必須連線到共同使用者CREATE ROLE與通常授予的SET CONTAINER許可權。
2.當前的容器必須是根容器。
3.常見角色的角色名稱必須與"C##"或"c##"為字首,並且包含唯一 ASCII 或 EBCDIC 字元。
4.在所有容器的角色名稱必須是唯一的。
5.角色建立與CONTAINER=ALL子句
6.公共角色可以賦予公共使用者或者本地使用者
操作:
注意:在 CDB 賦予角色許可權的時候,需要指定 container=all ,否則 PDB 中不可見。
SQL> show con_name
CON_NAME
-------------------
CDB$ROOT
SQL> create role c##role_andy;
公共角色賦權 To a common user:
SQL> grant select on dba_objects to c##role_andy container=all;
SQL> grant c##role_andy to c##andy container=all;


C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
SQL> 
set lin 300;
set pagesize 300;
col username for a30;
col granted_role for a30;
select * from  USER_ROLE_PRIVS;


USERNAME                       GRANTED_ROLE                   ADM DEL DEF OS_ COM INH
------------------------------ ------------------------------ --- --- --- --- --- ---
C##ANDY                        C##ROLE_ANDY                   NO  NO  YES NO  YES NO
SQL> select count(*) from dba_objects;


  COUNT(*)
----------
     72635


C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
set lin 300;
set pagesize 300;
col username for a30;
col granted_role for a30;
select * from  USER_ROLE_PRIVS;


USERNAME                       GRANTED_ROLE                   ADM DEL DEF OS_ COM INH
------------------------------ ------------------------------ --- --- --- --- --- ---
C##ANDY                        C##ROLE_ANDY                   NO  NO  YES NO  YES YES
SQL>  select count(*) from dba_objects;
  COUNT(*)
----------
     72629


公共角色賦權 To a local  user:
SQL> alter session set container=pdb01;
SQL> grant c##role_andy to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_objects;
  COUNT(*)
----------
     72629


四、建立本地角色
本地角色是以類似的方式到 pre-12 c 資料庫建立的。每個 PDB 可以具有與匹配的名稱,因為當地的作用範圍僅限於當前 PDB 的角色。
必須滿足以下條件。
條件:
1.必須連線到具有CREATE ROLE許可權的使用者。
2.如果您連線到公共使用者,容器必須設定為本地 PDB。
3.角色名稱為本地角色不必須與"C##"或"c##"作為字首。
4.角色名稱必須是唯一在 PDB 內。
5.本地角色可以賦權給公共使用者(作用範圍侷限於pdb內操作,不影響CDB許可權)或者本地使用者。
操作:
SQL> alter session set container=pdb01;
create role pdb_role;
grant select on dba_tables to pdb_role; 


本地角色賦權 To a common user:
grant pdb_role to c##andy;
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_tables;
  COUNT(*)
----------
      2106
C:\Users\andy>sqlplus c##andy/andy@10.100.25.16:1521/andycdb
SQL> select count(*) from dba_tables;
select count(*) from dba_tables
                     *
ERROR at line 1:
ORA-00942: table or view does not exist


本地角色賦權 To a local user:
grant pdb_role to andy;
C:\Users\andy>sqlplus andy/andy@10.100.25.16:1521/pdb01
SQL> select count(*) from dba_tables;
  COUNT(*)
----------
      2106

補充:

容器資料庫建立新使用者並分配表空間時必須在沒有PDB的情況下進行或PDB與CDB有相同的表空間的時候進行,否則會報錯。如果是在PDB與CDB 有相同表空間的情況下給CDB使用者分配表空間,則分配CDB的表空間給使用者PDB的表空間並不受影響。而且,CDB使用者必須以‘C##’為開頭,否則創 建不了。

SQL> create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01;
create user c##test identified by c##test default tablespace cdb_users temporary tablespace temp01
*
ERROR at line 1:
ORA-65048: error encountered when processing the current DDL statement in
pluggable database PDB01
ORA-00959: tablespace 'CDB_USERS' does not exist


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2138581/,如需轉載,請註明出處,否則將追究法律責任。

相關文章