前言:本博客僅作記錄學習使用,部分圖片出自網絡,如有侵犯您的權益,請聯系刪除
用戶管理在 Oracle 數據庫中至關重要。一個服務器通常只運行一個 Oracle 實例,而一個 Oracle 用戶代表一個用戶群,他們通過該用戶登錄并操作數據庫對象(如表、視圖等)。實際開發中,不同項目組通常使用獨立的 Oracle 用戶,避免相互干擾,同時通過權限控制實現跨模塊的數據訪問。一個 Oracle 用戶可以看作是一個業務模塊,不同模塊間的關聯通過權限管理實現。
1、用戶模式
Oracle 數據庫引入了模式(Schema)概念來管理用戶創建的數據庫對象。每個用戶創建的對象都屬于該用戶的模式。
模式內的對象默認不可被其他模式直接訪問,即使有權限,也需要通過“模式名.對象名”方式訪問(如 scott.dept
)
# 當其他用戶賬號下,比如system賬號下,要訪問scott賬號下創建的表dept,需要在表名前加上該表的所屬賬號scott
select * from scott.dept;
2、用戶登錄數據庫
SQLPlus 是 Oracle 自帶的客戶端工具,用于與數據庫交互。連接身份分為三種:
連接身份代表著該用戶連接數據庫后享受的權限,oracle有三種身份如下:
- sysdba:數據庫管理員身份,具有最高權限(如啟動/關閉數據庫、備份恢復等)
- sysoper:數據庫操作員身份,權限低于 sysdba
- normal:普通用戶,默認身份,只能操作自身模式的對象
sys用戶必須用sysdba才能登錄(使用:sys as sysdba),system用戶(數據庫管理員身份,直接使用:system)
sqlplus登錄用戶語法:sqlplus username/password@serviceName [as 連接身份]
?# 以系統管理員登錄數據庫:sqlplus system/Oracle23ai@FREE
切換用戶:connect username/password@serviceName [as 連接身份]
?connect sys/Oracle23ai@free as sysdba
SQLPlus 支持連接本地和遠程數據庫。
?語法:conn 用戶名/密碼@服務器連接字符串 as 連接身份(此身份需要解鎖)比如:connect sys/oracle23ai@192.168.1.133:1521/free as sysdba;
3、基本概念
-
CDB--Container Database,即容器數據庫;
-
PDB--Pluggable Database,即可插拔數據庫;
-
公共用戶--CDB公共用戶,必須以C##或c##開頭,Oracle會在每個PDB中同時創建該用戶;
-
本地用戶--PDB的用戶,本地用戶所在PDB中必須是唯一的,每個PDB可以有不同的本地用戶;
CDB和PDB是數據庫中的兩種重要概念
CDB是一個容器數據庫,名稱為CDB$ROOT,其作用就是系統數據庫,sys等賬號都保存在里面,同時它可以管理PDB數據庫。可以容納多個PDB類似于一個父容器。在CDB環境中,用戶稱為公共用戶,而在PDB環境中,用戶稱為本地用戶。
PDB是一種可插拔數據庫,它可以在CDB中獨立地創建、停止和啟動。每個PDB都有自己的數據文件、控制文件和日志文件,并且可以獨立的進行備份和恢復操作。PDB提供了更高的隔離性和安全性,因為每個PDB都有自己的安全上下文,并且只能通過指定的用戶訪問。
3.1、常用命令
?--打開PDBalter pluggable database pdb名稱 open;--關閉PDBalter pluggable database pdb名稱 close;--切換PDBalter session set container=pdb名稱(指定容器);--查看當前所在容器show con_name;?--查看所有的PDBshow pdbs;?--切換到mypdbalter session set container=mypdb;
3.2、創建用戶
- 每個用戶都有自己的用戶名和密碼,以及權限和角色,用戶訪問和管理數據庫中的對象
- 使用CREATE和DROP來創建和刪除用戶。用戶對它所擁有的對象具有所有的增刪改的權限
- 可以使用ALTER USER命令來修改用戶的屬性,如密碼、默認表空間以及存儲配額
- 用戶可以被授予不同的權限或角色
?sqlplus system/Oracle23ai@free ? ?--連接數據庫(管理員角色)?# CDB(Contaniner Database)容器中 創建用戶時,前面必須添加C##,而PDB(Pluggable Database)數據庫不需要加前綴#COMMON USERS(普通用戶):經常建立在CDB層,用戶名以C##或c##開頭;#LOCAL USERS(本地用戶):僅建立在PDB層,建立的時候得指定CONRAINER?--看數據庫是否為CDBselect CDB from v$database;--創建用戶create user C##fox identified by Oracle23ai;?--配置權限grant dba,connect,resource,create view to C##fox;grant create session to C##fox;grant select any table to C##fox;grant update any table to C##fox;grant insert any table to C##fox;?--連接登錄測試conn c##fox/Oracle23ai@free?--修改用戶密碼、鎖定狀態alter user c##foxidentified by ****** ? ?--修改密碼account lock; ? --修改用戶處理鎖定狀態或者解鎖狀態--刪除用戶drop user c##fox;
雖然創建了用戶,但還不能使用,需要給予用戶授于數據庫角色和設置用戶權限
3.3、數據庫角色
Oracle數據庫角色是若干系統權限的集合,給Oracle用戶進行授權數據庫角色 ,就是等于賦予該用戶若干數據庫系統權限。常用數據庫角色如下:
- CONNECT:允許用戶連接數據庫,建立會話。
- RESOURCE:允許用戶創建數據庫對象(如表、視圖、存儲過程等)。
- DBA:擁有所有系統權限,可管理數據庫和授權其他用戶。
三個數據庫角色對應有三個連接身份:
4、用戶權限
Oracle數據庫用戶權限分為:系統權限和對象權限兩種
- 系統權限:如 create session(登錄權限)、create table(創建表權限)。
-
對象權限:如對表的 select、insert、update、delete操作權限。
5、授權操作
?--GRANT 數據庫角色 to 用戶grant connect to C##fox; --授于connect角色(必須)grant resource to C##fox; --授于resource角色grant dba to C##fox; --授于管理員dba角色?--GRANT 用戶的系統權限 to 用戶grant create session to C##fox; --授于用戶登錄數據庫的權限?--授于用戶操作表空間的權限grant unlimited tablespace to C##fox;grant create tablespace to C##fox;grant alter tablespace to C##fox;grant drop tablespace to C##fox;grant manage tablespace to C##fox;?--操作表grant create table to C##fox; (包含有create index權限、alter table、drop table權限)--操作視圖grant create view to C##fox; (包含有alter view、drop view權限)--操作觸發器grant create trigger to C##fox; (包含有alter trigger、drop trigger權限)--操作存儲過程grant create procedure to C##fox;(包含有alter precedure,drop procedure和function以及package權限)--操作序列grant create sequence to C##fox;; (包含有創建、修改、刪除以及選擇序列)--回退段grant create rollback segment to C##fox;grant alter rollback segment to C##fox;grant drop rollback segment to C##fox;--同義詞grant create synonym to C##fox; (包含drop sysnonym權限)grant create public sysnonym to C##fox;grant drop public sysnonym to C##fox;--關于用戶grant create user to C##fox;grant alter user to C##fox;grant become user to C##fox;grant drop user to C##fox;--關于角色grant create role to C##fox;--操作概要文件grant create profile to C##fox;grant alter profile to C##fox;grant drop profile to C##fox;--從sys用戶所擁有的數據字典表中進行選擇grant select any dictionary to C##fox;?--GRANT 用戶的對象權限 on 對象 TO 用戶grant select,insert,update,delete on emp to C##fox;--把emp表的全部操作權限授于fox用戶grant all on emp to C##fox;
6、查看用戶的權限或角色
6.1、查看用戶
?show user; //查看當前用戶名?--查看所有用戶select * from dba_users;select * from all_users;select * from user_users; //查看當前用戶
6.2、查看角色
?--1、當前用戶被激活的全部角色select * from session_roles;--2、當前用戶被授于的角色select * from user_role_privs;--3、全部用戶被授于的角色select * from dba_role_privs;--4、查看某個用戶所擁有的角色select * from dba_role_privs where grantee='用戶名';--5、一個角色包含的系統權限select * from dba_sys_privs where grantee='角色名';select * from dba_sys_privs where grantee='CONNECT'; ? ? ? --connect要大寫或者select * from dba_sys_privs where role='角色名';--6、一個角色包含的對象權限select * from dba_roles;--7、查看所有角色select * from dba_roles;
6.3、查看權限
?--1、基本權限查詢select * from session_privs; --當前用戶所擁有的全部權限select * from user_sys_privs; --當前用戶的系統權限select * from user_tab_privs; --當前用戶的對象權限select * from dba_sys_privs; --查詢某個用戶所擁有的系統權限select * from role_sys_privs; --查看角色(只能查看登錄用戶擁有的角色)所包含的權限--2、查看用戶的系統權限(直接賦值給用戶或角色的系統權限)select * from dba_sys_privs;select * from user_sys_privs;--3、查看用戶的對象權限select * from dba_tab_privs;select * from all_tab_privs;select * from user_tab_privs;--4、查看哪些用戶有sysdba或sysoper系統權限(查詢時需要相應權限)select * from v$pwfile_users;
6.4、補充
?--1、以下語句可以查看Oracle提供的系統權限select name from sys.system_privilege_map--2、查看一個用戶的所有系統權限(包含角色的系統權限)select privilege from dba_sys_privs where grantee='SYSTEM'unionselect privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='SYSTEM');--3、查詢當前用戶可以訪問的所有數據字典視圖select * from dict where comments like '%grant%';--4、顯示當前數據庫的全稱select * from global_name
7、取消用戶權限
?--Revoke 對象權限 on 對象 from 用戶revoke select,insert,update,delete on emp from C##fox;?--Revoke 系統權限 from 用戶grant create session to C##fox; --授于用戶登錄數據庫的權限revoke SELECT ANY TABLE from C##fox;?--Revoke 角色(role) from 用戶revoke RESOURCE from C##fox;
學習永無止境,讓我們共同進步!!