Oracle12c多租戶管理用戶、角色、權限
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 [email protected]
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
C:\Users\andy>sqlplus [email protected]: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 [email protected]