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 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
那麼我們如何在容器資料庫 (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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 許可權管理之多租戶隔離授權
- Oracle使用者角色許可權管理Oracle
- 使用者角色許可權管理架構架構
- oracle 12c 多租戶體系結構概念之資料字典、服務、使用者、角色與許可權Oracle
- MySQL5.7&8.0許可權-角色管理MySql
- RabbitMQ使用教程(二)RabbitMQ使用者管理,角色管理及許可權設定MQ
- Rbac使用者角色許可權表設計
- Linux賬戶與許可權管理Linux
- mysql使用者許可權管理MySql
- MongoDB 使用者與許可權管理MongoDB
- MySQL 使用者及許可權管理?MySql
- Linux使用者、組、許可權管理Linux
- MySQL使用者及許可權管理MySql
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- Laravel——使用者角色許可權控制包 Laravel-permissionLaravel
- 關於SQL Server資料庫中的使用者許可權和角色管理SQLServer資料庫
- 使用者許可權管理之使用者與組管理
- OpenShift 使用者許可權管理例項
- MySQL-03.使用者管理和許可權管理MySql
- vsftpd多例項多使用者不同許可權FTP
- 使用者角色許可權控制包 Laravel-permission 使用說明Laravel
- PostgreSQL資料庫使用者許可權管理SQL資料庫
- 前端如何進行使用者許可權管理前端
- mysql 使用者及許可權管理 小結MySql
- 4、許可權管理
- sql許可權管理SQL
- RBAC許可權管理
- MySQL許可權管理MySql
- 許可權管理策略
- PostgreSQL:許可權管理SQL
- Odoo許可權管理Odoo
- 特殊許可權管理
- Part II 配置和管理多租戶環境概述-Oracle多租戶管理員指南Oracle
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- 005.OpenShift訪問控制-許可權-角色
- nodejs的使用者許可權管理——acl.mdNodeJS
- linux使用者許可權Linux
- Security 10:許可權管理
- casbin-許可權管理