一.使用者管理
1.公共使用者和本地使用者
12c+中的使用者分為:公共使用者和本地使用者
公共使用者:可以為CDB管理者建立,公共使用者是在所有的PDB中都可以使用的使用者,公共使用者的資訊存在CDB$ROOT中,并且存在于所有的PDB中.公共使用者需要連到CDB進行建立和管理.在CDB中建立的使用者預設就是公共使用者,可以省略container=all.在CDB中隻能建立公共使用者,不能建立本地使用者.
本地使用者:本地使用者隻會存儲在對應的PDB中.在PDB中建立的使用者預設就是本地使用者,可以省略container=current.在PDB中隻能建立本地使用者,不能建立公共使用者.
為了區分公共用和本地使用者,引進了新的參數common_user_perfix,表示公共使用者的字首.預設為c##,也就是說如果你想建立了一個公共使用者,必須帶上字首.此字首是可以進行修改的,但是建議不要修改.
SQL> show parameter common_user
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix string C##
2.建立使用者
1).建立公共使用者
公共使用者隻能在CDB$ROOT進行建立和管理.在CDB中建立的使用者,預設就為container=all,在建立公共使用者的時候,必須指定字首,否則報錯:
SQL> create user suq identified by suq container=all;
create user suq identified by suq container=all
*
ERROR at line 1:
ORA-65096: invalid common user or role name
SQL> create user c##suq identified by suq;
User created.
在CDB$ROOT中隻能建立公共使用者,不能建立本地使用者,否則報錯:
SQL> create user amy identified by amy container=current;
create user amy identified by amy container=current
*
ERROR at line 1:
ORA-65049: Creation of local user or role is not allowed in this container.
建立資料庫的時候建立的一些系統使用者也是公共使用者,例如sys,system等,隻是他們沒有以c##開頭,我想可能是為了和以前版本相容.
2).建立本地使用者
先連接配接到具體的PDB,再進行建立,則建立的就是本地使用者,建立本地使用者的文法和12c以前的沒什麼差別,但是建立的本地使用者隻有在目前PDB中才存在:
SQL> alter session set container=brent;
Session altered.
SQL> create user amy identified by amy ;
User created.
在PDB中不能建立公共使用者:
SQL> create user c##carol identified by carol container=all;
create user c##carol identified by carol container=all
*
ERROR at line 1:
ORA-65050: Common DDLs only allowed in root.
3.查詢使用者
在12c中對dba_的資料字典做了修改.如果你處在CDB$ROOT中,如果查詢DBA_視圖,那麼你隻能查詢到公共的資料字典.如果你處在PDB中,那麼你查詢DBA_視圖隻能查到此PDB的資料字典.
12c中新增了CDB_資料字典,可以檢視所有的資料字典.
是以,當你在CDB中查詢dba_users,那你隻能查詢到公共的使用者,當你處于PDB中,那麼你隻能查到PDB中的本地使用者.
如果你想查詢所有的使用者,可以使用下的語句,其中新增oracle_maintained字段提示了此使用者是否由oracle管理.
select a.username,a.common,a.con_id,decode(a.CON_ID,1,'CDB$ROOT',b.pdb_name) name from cdb_users a,cdb_pdbs b
where a.con_id=b.con_id(+) and oracle_maintained='N'
order by a.con_id,a.username;
SQL> select a.username,a.common,a.con_id,decode(a.CON_ID,1,'CDB$ROOT',b.pdb_name) name from cdb_users a,cdb_pdbs b
where a.con_id=b.con_id(+) and oracle_maintained='N'
order by a.con_id,a.username; 2 3
USERNAME COM CON_ID NAME
------------------------------ --- ---------- --------------------------------------------------------------------------------------------------------------------------------
C##DSG YES 1 CDB$ROOT
C##SUQ YES 1 CDB$ROOT
AMY NO 3 BRENT
C##DSG YES 3 BRENT
C##SUQ YES 3 BRENT
SUQ NO 3 BRENT
C##DSG YES 4 TESTPDB1
C##SUQ YES 4 TESTPDB1
SUQ NO 4 TESTPDB1
C##DSG YES 5 TESTPDB2
C##SUQ YES 5 TESTPDB2
SUQ NO 5 TESTPDB2
C##DSG YES 7 TESTPDB3
C##SUQ YES 7 TESTPDB3
SUQ NO 7 TESTPDB3
5.修改使用者
修改使用者密碼和上面建立的思想一樣,公共使用者隻能在CDB$ROOT中進行修改.本地使用者隻能在PDB中進行修改:
SQL> alter user c##suq identified by suq2;
User altered.
6.删除使用者
和上面的思想一樣:
SQL> drop user c##suq cascade;
User dropped.
二.權限管理
1)本地授權
在PDB内部的授權為本地授權.本地授權和以前的授權方法幾乎一樣.額外的,我們可以在PDB中對公共使用者進行授權.也就是說公共使用者雖然在所有PDB中都存在這個使用者,并不是說你建立了公共使用者,他就有權限通路所有PDB,
需要單獨賦予create session 權限.
例如我們建立一個公共使用者,剛建立玩的使用者是沒有登入權限的:
SQL> create user c##suq identified by suq;
User created.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 BRENT READ WRITE NO
4 TESTPDB1 READ WRITE NO
5 TESTPDB2 READ WRITE NO
7 TESTPDB3 READ WRITE NO
SQL>
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> conn c##suq/suq
ERROR:
ORA-01045: user C##SUQ lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
如果我們在CDB中賦予了c##suq登入權限,他就可以登入到CDB,(注意,這裡如果不添加container子句,則預設為current)
SQL> conn / as sysdba
Connected.
SQL> grant create session to c##suq;
Grant succeeded.
SQL> conn c##suq/suq
Connected.
但是我們此時還沒有賦予單獨的PDB權限給他,是以他嘗試連接配接其他PDB的時候會報錯:
SQL> alter session set container=brent;
ERROR:
ORA-01031: insufficient privileges
此時我們就需要為公共使用者授權:
SQL> conn / as sysdba
Connected.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=brent;
Session altered.
SQL> grant create session to c##suq with admin option container=current;
Grant succeeded.
2)公共授權
公共授權的的意思是我們可以在CDB$ROOT中,對公共使用者進行公共授權,授權之後的使用者就擁有了所有PDB的相關權限:
公共授權添加container=all關鍵字即可:
SQL> conn / as sysdba
Connected.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> grant create session to c##suq container=all;
Grant succeeded.
[[email protected] ~]$ sqlplus c##suq/[email protected]/brent
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 25 23:41:17 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Sep 25 2019 23:40:13 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
那麼此時c##suq就擁有的所有PDB的登入權限:
[[email protected] ~]$ sqlplus c##suq/[email protected]/testpdb2
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 25 23:41:24 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Sep 25 2019 23:41:17 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
常用的一些權限:
grant Create Session to c##Test container=all;
grant Set Container to c##Test container=all;
grant Set Container to c##Test container=all;
3)檢視權限
可以通過檢視dba_sys_privs檢視賦予的權限:
SQL> select * from dba_sys_privs where grantee like 'C##%';
GRANTEE PRIVILEGE ADM COM INH
-------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------- --- --- ---
C##SUQ CREATE SESSION NO NO NO
C##SUQ CREATE SESSION NO YES NO
4)修改公共使用者的公共通路資源
預設公共使用者可以檢視CDB的資訊,也可以檢視v$視圖.但是我們可以使用container_data參數控制公共使用者通路的粒度.
例如下面我們設定公共使用者對v$session隻能查詢某個PDB上的資料:
SQL> alter user c##suq set container_data=(CDB$ROOT,BRENT) for v_$session container=current;
User altered.
可以通過查詢dba_container_data字典,查詢剛剛的操作:
SQL> select * from dba_container_data;
USERNAME D OWNER OBJECT_NAME A CONTAINER_NAME
-------------------- - -------------------- ------------------------------ - ------------------------------
GSMADMIN_INTERNAL N SYS GV_$ACTIVE_SERVICES Y
GSMADMIN_INTERNAL N SYS CDB_SERVICES Y
APPQOSSYS N SYS V_$WLM_PCMETRIC Y
APPQOSSYS N SYS V_$WLM_DB_MODE Y
APPQOSSYS N SYS V_$WLM_PCSERVICE Y
APPQOSSYS N SYS GV_$WLM_DB_MODE Y
APPQOSSYS N SYS V_$CONTAINERS Y
APPQOSSYS N SYS DBA_PDBS Y
C##SUQ N SYS V_$SESSION N CDB$ROOT
C##SUQ N SYS V_$SESSION N BRENT
SYSTEM Y Y
DBSFWUSER Y Y
DBSNMP Y Y
但是注意,這種限制隻能限制在CDB中的通路,如果此公共使用者擁有PDB的set container權限,那麼他就可以先alter session set container,然後再進行查詢.
5)使用者代理
使用者代理可以允許我們以其他使用者的身份登入資料庫,然後在資料庫裡看來,和此使用者登入資料庫一模一樣,
SQL> alter user suq grant connect through test;
User altered.
SQL> connect test[suq]/test
Connected.
SQL> show user;
USER is "SUQ"
三.鎖定概要檔案(lockdown profile)
我們可以在某個PDB中給某個使用者DBA權限,這樣此使用者就會擷取到此PDB的DBA權限,但是沒有CDB的DBA權限.但是在12.1中,此使用者還是可能潛在存在對CDB或者伺服器破壞的權限,
例如生産大量的trc檔案.在12.2中引入了鎖定概要檔案.
1.首先連接配接到CDB,建立鎖定概要檔案
SQL> create lockdown profile test_lockdown_profile;
Lockdown Profile created.
檢視概要檔案通過字典:DBA_LOCKDOWN_PROFILES
2.通過概要檔案,建立規則
例如資料庫中沒有分區表,為了確定沒有人會建立,禁用分區表的建立:
SQL> alter lockdown profile test_lockdown_profile disable option=('Partitioning');
Lockdown Profile altered.
3.将鎖定概要檔案應用到指定PDB
SQL> alter session set container=testpdb3;
Session altered.
SQL> alter system set pdb_lockdown=test_lockdown_profile;
System altered.
鎖定概要檔案非常強大,可以對一些特定的選項做啟用或者禁止.