oracle用戶與權限
在安裝好Oracle數據庫之後我們的任務自然是保證數據庫的安全性。
管理默認賬號
在創建數據庫實例的時候,Oracle會給我們創建出一些賬號,在Oracle 10g 來說,如果不在安裝過程中修改配置,默認情況下,除了sys、system 賬號都是出於鎖定的。
在安裝完畢之後,我們可以通過以下SQL查看有哪些默認用戶,結果如圖所示。
select username from dba_users;
我們可以看到,有很多的默認賬號,我們無法區分那些賬號是我們需要到的,不要試圖刪除默認賬號,不然一旦出現問題不好恢復,我們用不到讓他處於鎖定狀態就可以了。
sys和system賬號的區別:sys是數據庫的超級用戶賬號,而system只是一個獲得dba權限的用戶賬號。一般我們可以鎖定system,創建一個沒這麼容易猜測到的dba賬號,提高安全性。
鎖定解鎖和密碼
我們可以通過以下SQL解鎖鎖定的賬號
alter user SCOTT account unlock;
賬號操作
創建用戶
下面創建一個lucky
賬號,並且解鎖賬號。
CREATE USER lucky IDENTIFIED BY "123456" ACCOUNT UNLOCK
DEFAULT tablespace USERS
temporary tablespace TEMP
quota unlimited on USERS;
創建用戶的時候分配一下表空間,不然下面的演示無法創建數據表。當然後面進行分配也是可以的
創建出來的lucky
賬號是一個沒有任何權限的賬號,甚至連登陸都不可以,我們需要給他賦予一個登陸權限。
grant create session to lucky;
現在可以切換登陸賬號:
conn lucky/123456;
現在的
lucky
用戶只有一個登陸權限,需要其他權限管理,請看下面的權限管理
刪除用戶
在刪除用戶之前,建議先鎖定用戶,因爲這樣我們可以知道是否有人正在使用這個賬號。
alter user lucky account lock;
如果有人使用,將會報錯 the account is locked
如果確定不再使用
drop user lucky;
如果不成功
drop user lucky cascade;
在刪除用戶,被刪除的用戶擁有的所有表都會被刪除。此外,該用戶所有的索引、觸發器和參照完整性約束也會被刪除。如果其他方案中的參照完整性約束依賴被刪除的主鍵和唯一鍵約束,那麼這些參照完整性約束也會被刪除。oracle不會刪除依賴被刪除用戶擁有對象的視圖、同義詞、過程、函數或軟件包,但會使他們失效。
密碼操作
Oracle修改密碼
alter user SCOTT identified by values '12345';
Oracle找回密碼
有時候我們可能要使用找回密碼
功能,比如我們項目中比較多地方使用了賬號密碼的硬編碼,這個時候該項目就不太現實。
-
使用dba特權用戶查看用戶的配置文件,下面以找回
SCOTT
用戶的密碼爲例。select username,profile from dba_users where username='SCOTT';
-
創建一個臨時的配置文件。
create profile temp_prof limit PASSWORD_REUSE_MAX unlimited PASSWORD_REUSE_TIME unlimited;
-
將這個配置文件分配給改用戶。
alter user SCOTT profile temp_prof;
-
查看
select password from SYS.user$ where name='SCOTT';
-
此時將密碼修改爲此密碼即可
alter user SCOTT identified by values '123456';
-
將原來的配置分配給用戶
alter user SCOTT profile default;
-
刪除臨時配置文件
drop profile temp_prof;
權限管理
在oracle 中,我們必須要爲用戶分配權限,才能讓他們在數據庫進行操作,一般我們有兩種方式:一、直接給用戶分配對應的權限;二、我們可以將對應的權限分配給角色,然後將角色賦予用戶的方式。權限分爲系統權限和對象權限。以下我們從權限的分配和收回進行講解。
系統權限分配
系統權限主要包括數據庫連接、創建修改對象之類的任務,我們可以查看Oracle中的系統權限
select distinct privilege from dba_sys_privs;
查看當前用戶有哪些權限
select * from session_privs;
我們採用 grant
分配權限,多個權限用 ,
隔開,用 with admin option
子語句進行權限傳遞性。
單個權限
grant create session to lucky;
多個權限
grant create session,create table to lucky;
分配dba權限
grant create session,create table to lucky;
分配給所有用戶 即 public
但不建議這麼使用
grant create session,create table to public
使 lucky
用戶也擁有爲其他用戶分配權限的能力,即管理權限的能力
grant create session,create table to lucky with admin option;
回收權限
revoke create session from lucky;
需要注意的是,回收權限是沒有傳遞性的,例如:
lucky
用戶給tom
分配了權限,那麼以上語句只能回收lucky
的權限,lucky
將不能登錄,但是tom
依然可以登錄。
附:常見的系統權限
權限名稱 | 功能介紹 |
---|---|
create session | 擁有此權限才能連接數據庫 |
create table | 擁有創建表的權限 |
create role | 創建角色的權限 |
create view | 建視圖 |
create procedure | 建過程、函數、包 |
create public synonym | 建同義詞 |
create trigger | 建觸發器 |
對象權限分配
擁有數據庫對象權限可以訪問和操作其他用戶的對象。可賦予的數據庫對象權限包括:表、視圖、物化視圖、序列、軟件包、函數、過程、用戶自定義類型和目錄的權限。要獲得賦予對象權限的能力,必須符合下列條件之一:
-
擁有對象,即自己擁有對象,想分配給其他用戶操作此對象的權限;
-
已經通過
WITH GRANT OPTION
子句獲得了對象權限; -
擁有
CRANT ANY OBJECT PRIVILEGE
系統權限。
或者我們可以比較形象的想象爲表對象的分享,比如現在比較流行的在線文檔,我將表可以分享給指定的人,並可以限制他的權限,設置爲可讀、可編輯等。oracle中對象權限的概念和這個差不多,大家可以對比更助於理解。
查看系統中對象權限
select distinct privilege from dba_tab_privs;
下面列出常見的對象權限,看名字我們就大概知道是什麼意思了,就不在做詳細的解釋。
-
alter
-
delete
-
select
-
insert
-
update
-
index
-
references
-
execute
下面我們舉例說明分配權限的過程,我們用 conn lucky/123456
連接lucky
用戶,我們先用 lucky
用戶創建一個test_tb
表,並插入數據:
create table test_tb(ID varchar2(30));
insert into test_tb values('12345');
select * from test_tb;
切換爲sysdba
身份新建一個TOM
用戶,並分配權限
CREATE USER TOM IDENTIFIED BY "123456" ACCOUNT UNLOCK
DEFAULT tablespace USERS
temporary tablespace TEMP
quota unlimited on USERS;
grant create session,create table to TOM with admin option;
切換到TOM
賬號,我們可嘗試使用TOM
賬號查詢 lucky.test_tb
表,
select * from lucky.test_tb;
沒有權限我們會發現報錯信息[ORA-00942: 表或視圖不存在],由於Tom沒有權限查看此表,自然報錯找不到。
切換到LUCKY
賬號,LUCKY
擁有 test_tb
表,現在要將他的權限分配給 TOM
用戶,下面兩種寫法都可以:
grant all on test_tb to TOM;
--或者
grant select,insert,update,delete on test_tb to TOM;
all 即已經包括了select,insert,update,delete 這些權限,有時我們需要設置爲只讀,那麼我們可以設置爲select即可,按需求而定。
我們想要對象權限可以以級聯的方式將相同的對象賦予其他用戶,可以使用WITH GRANT OPTION
子語句。例如:
grant all on test_tb to TOM WITH GRANT OPTION;
回收權限
revoke all on test_tb from TOM;
--或者指定回收某個權限,如下指定回收刪除權限。
revoke delete on test_tb from TOM;
集中方式分配
我們採用將一系列權限綁定到一個角色,然後將這個角色分配給多個用戶,這個方式更加有利於我們的管理,更加方便使用。
首先我們應該創建一個角色,先切換到 dba用戶:
create role test_role;
然後我們將權限分配給這個角色:
grant select any table to test_role;
grant create any table to test_role;
grant create any view to test_role;
grant create any synonym to test_role;
grant create database link to test_role;
當前用戶相關查詢
--查看用戶和默認表空間的關係
select username,default_tablespace from dba_users;
--查看當前用戶能訪問的表
select * from user_tables;
--Oracle查詢用戶表
select * from user_all_tables;
--Oracle查詢用戶視圖
select * from user_views;
--查詢所有函數和儲存過程:
select * from user_source;
--查詢所有用戶:
select * from all_users;
--select * from dba_users
--查看當前用戶連接:
select * from v$Session;
--查看用戶角色
SELECT * FROM USER_ROLE_PRIVS;
--查看當前用戶權限:
select * from session_privs;
--查看所有用戶所擁有的角色
SELECT * FROM DBA_ROLE_PRIVS;
--查看所有角色
select * from dba_roles;
--查看數據庫名
SELECT NAME FROM V$DATABASE;
--查詢所有函數和儲存過程:
select * from user_source;
--查詢所有用戶:
select * from all_users;
--select * from dba_users
--查看當前用戶連接:
select * from v$Session;
--查看用戶角色
SELECT * FROM USER_ROLE_PRIVS;
--查看當前用戶權限:
select * from session_privs;
--查看所有用戶所擁有的角色
SELECT * FROM DBA_ROLE_PRIVS;
--查看所有角色
select * from dba_roles;
--查看數據庫名
SELECT NAME FROM V$DATABASE;