oracle用戶與權限

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找回密碼

​ 有時候我們可能要使用找回密碼功能,比如我們項目中比較多地方使用了賬號密碼的硬編碼,這個時候該項目就不太現實。

  1. 使用dba特權用戶查看用戶的配置文件,下面以找回SCOTT用戶的密碼爲例。

     select username,profile from dba_users where username='SCOTT';
    
  2. 創建一個臨時的配置文件。

    create profile temp_prof limit PASSWORD_REUSE_MAX unlimited PASSWORD_REUSE_TIME unlimited;
    
  3. 將這個配置文件分配給改用戶。

    alter user SCOTT profile temp_prof;
    
  4. 查看

    select password from SYS.user$ where name='SCOTT';
    

在這裏插入圖片描述

  1. 此時將密碼修改爲此密碼即可

    alter user SCOTT identified by values '123456';
    
  2. 將原來的配置分配給用戶

    alter user SCOTT profile default;
    
  3. 刪除臨時配置文件

    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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章