程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle數據庫權限管理

oracle數據庫權限管理

編輯:Oracle教程

oracle數據庫權限管理


權限管理: oracle 9裡面默認的三個用戶名和密碼: sys change_on_install //權限最高的管理員 system manager //普通的管理員 scott tiger //普通用戶 在oracle 10中,仍然使用這三個用戶作為默認用戶。但sys和system用戶的密碼不再默認。
 權限管理:

  oracle 9裡面默認的三個用戶名和密碼:

  sys change_on_install //權限最高的管理員

  system manager //普通的管理員

  scott tiger //普通用戶

  在oracle 10中,仍然使用這三個用戶作為默認用戶。但sys和system用戶的密碼不再默認。在安裝數據庫的時候,可以由用戶指定 。從安全角度考慮,scott用戶默認被鎖定,所以要使用該用戶,

需要先解除鎖定。

  注意:我們要使用oracle數據庫,至少要啟動兩個服務,一個是監聽服務,一個是數據庫實例。

  創建用戶;

  以系統管理員的身份登陸。

  使用語句:create user lisi identified by lisi; //創建了一個叫lisi的用戶,密碼也為lisi

  雖然創建了用戶,但該用戶現在並無任何權限。就連登陸數據庫的權限都沒有。假如使用:sqlplus lisi/lisi 登陸數據庫,會報錯,顯示沒有create session的權限。

  所以還是先使用系統管理員給lisi這個用戶指定登陸的權限。

  語句為:grant create session to lisi;

  授權過後,lisi可以登陸數據庫了。但是現在還沒有創建數據庫表的權限,仍需指定。

  語句為:grant create table to lisi;

  使用lisi賬號,創建數據庫表:create table mytable(id int);

  執行後卻提示錯誤:對表空間‘USERS’無權限。每個數據庫表都有自己的表空間,相當於文件必須位於某個文件夾下。

  雖然lisi用戶具有創建表的權限,但沒有使用表空間的權限,最終還是創建不了表。這就好比你有我房間的鑰匙,但是沒有我家大門的鑰匙,你最終還是進不了我的房間。

  通過系統管理員授予lisi用戶使用表空間的權限:

  grant unlimited tablespace to lisi;這樣用戶lisi對表空間的使用就沒有限制了。

  在lisi賬戶下,創建表:create table mytable(id int);

  插入一條記錄:insert into mytable values(1);

  插入成功。

  也可以刪除表:drop table mytable;

  有人可能會產生疑問,既然數據庫的權限管理這麼嚴格,上面我們只是授予lisi用戶創建表的權限。並沒有授予其插入,刪除等權限呀。這裡我們可以這樣理解:當前用戶創建了一個表,那麼該表

就屬於該用戶,用戶既然創建了表,自然就對該表擁有一切權限啦。

  而且:數據庫並沒有drop table的權限。使用:grant drop table to lisi;出現:權限缺失或無效的錯誤提示。

  上面是授予權限,那麼如何撤銷用戶的某個權限呢?

  使用如下語句可以撤銷lisi的創建表的權限:revoke create table from lisi;

  再使用lisi賬號創建表,就會出現錯誤提示:權限不足。

  在大多情況下,如果我們對用戶的權限經常修改,我們如何知道用戶有哪些權限呢?

  數據庫默認維護了一個視圖對外提供一些系統信息(叫數據字典),可以查看用戶的具體權限。

  使用如下語句查看當前用戶的系統權限:

  select * from user_sys_privs;

  USRENAME PRIVILEGE ADM

  ----------------------------------------------- ---------------------------------------- ----

  LISI CREATE SESSION NO

  LISI UNLIMITED TABLESPACE NO

  oracle中的權限分為系統權限和對象權限。

  系統權限就是我們上面所講的一些權限。

  對象權限是指:比如用戶lisi創建了一個表,該表就可以作為一個對象看待。另外一個用戶是否有訪問該表的權限呢。這就是所謂的對象權限管理。

  我們在創建一個用戶wangwu。密碼也為wangwu。在該用戶下,創建一個表mytab。如果lisi用戶向訪問表mytab,是否會成功呢?

  在lisi的窗口下,輸入:select * from mytab;報錯:表或視圖不存在。我們知道表屬於表的創建者。

  這裡我們直接查詢表mytab,數據庫會到當前用戶下尋找該表,顯然當前用戶lisi沒有表mytab。所以提示表或視圖不存在。

  那我們指定表的所有者,再次查詢:select * from wangwu.mytab;窗口顯示“權限不足”的錯誤提示。由此可知,雖然找到了mytab表,卻沒有訪問的權限。

  只有表的擁有者才可以授予該表的相關權限給其他用戶。使用用戶wangwu的操作窗口,使用如下語句,把查詢語句授予lisi;

  grant select on mytab to lisi;

  執行此語句後,lisi就可以查詢用戶wangwu的mytab表了。

  如果要獲得其他對於mytab表的權限,仍然需要指定(多個權限同時指定,用逗號分隔):

  grant update,select,delete on mytab to lisi;

  如果要把表的所有權限都賦予給用戶lisi,可以這樣寫;

  grantallon mytab to lisi;

  在wangwu的窗口下,向mytab插入幾條數據。然後查詢,卻顯示“未選定行”。說明剛才的插入沒有同步到數據庫中去。

  在oracle下,默認需要對sql語句手動進行提交。所以在幾條插入語句後,可以執行commit;語句提交。再次查詢,表中就有數據了。

  如果要把某個權限授予所有的用戶,可以使用public關鍵字:

  grant create session topublic;

  查看當前用戶的對象權限,使用如下語句:

  select * from user_tab_privs;

  oracle的權限控制粒度很細,甚至可以精確到某一列的權限。

  grant update(name) on mytab to lisi;

  這句執行的效果就是,lisi用戶對表mytab僅擁有更新name這一列的權限。

  grant insert(id) on mytab to lisi;

  查看當前用戶對數據庫表的列的權限:

  select * from user_col_privs;

  在lisi權限下,執行:update wangwu.mytab set name='fdsfa',id="dfs" where id=1;

  執行後顯示權限不足。

  update wangwu.mytab set name="fsa" where id=1;

  這樣就可以了。

  同樣執行:insert into wangwu.mytab values(4,"asf");執行後也顯示權限不足。

  修改語句為:inset into wangwu.mytab(id) values(4);成功執行。

  只能對更新和插入設定精確到某列的權限控制,不能對查詢和刪除設定。

  命令:show user可以查看當前用戶

  數據庫有三種類型的語句:

  ddl:數據定義語言,指定是數據庫表的創建,刪除之類的操作。

  dml:數據操縱語言,針對表的增刪改查操作,只有dml需要進行提交操作。

  dcl:數據控制語言,對系統權限和對象權限的管理。

  權限的傳遞:

  系統權限的傳遞:

  sys用戶把一些系統權限授權給lisi用戶.

  grant alter any table to lisi;

  查看lisi的系統權限,就有了alter any table的權限。

  現在lisi想把該權限傳遞授權給wangwu用戶執行以下語句:grant alter any table to wangwu;執行後報“權限不足”。

  要想lisi也可以傳遞權限,可以在sys用戶授權時加上with admin option的選項,該選項就說明了還擁有權限的管理能力。

  即:grant alter any table to lisiwith admin option;這樣lisi就可以把alter any table的權限傳遞給wangwu了。

  要想wangwu也可以傳遞該權限,也使用該admin選項即可。

  查看lisi的系統權限,他的alter any table權限的同一行的adm字段取值由NO變為YES,說明lisi對該權限具有分配功能了。

  對象權限的傳遞:

  與系統權限的傳遞類似,不過後面的選項有所改變:

  加入sys創建了一個A表。授予lisi的select權限:

  grant select On A to lisi;

  如果想讓lisi擁有對A表的select權限的分配能力,只需修改為:

  grant select On A to lisiwithgrantoption;

  思考:如果sys管理員撤銷了lisi的權限,那麼wangw的權限是否也被撤銷了呢?

  通過角色對權限進行管理

  如果按照上面的權限管理方法 ,對每個用戶逐一的分配權限,必然會很混亂,導致管理的困難。所以oracle提供了角色來對權限進行集合化的管理。

  角色就是權限的集合。

  在sys下創建角色:

  create role myrole;

  給角色添加權限:

  grant create session to myrole;

  grant create table to myrole;

  創建用戶:

  create user zhangsan;

  grant myrole to zhangsan;//賦予以上的兩個權限給zhangsan

  有些系統權限無法直接賦予角色,因為該權限太大了,比如unlimited tablespace。

  例如:執行grant unlimited tablespace to myrole;

  出現錯誤提示:無法將unlimited tablespace授予角色

  刪除角色:

  drop role myrole;

  權限舉例:

  create table create any table

  [alter table] alter any table

  [delete table] delete any table

  補充:oracle數據庫不含紫色的權限類型。因為有了create table權限,說明表的一切都歸創建者。不需要還指定alter table和drop table權限了,默認就有了。

  而create any table這個權限表明該用戶可以給其他用戶創建表。

  示例:wangwu給lisi創建一個表temp

  create tablelisi.temp(id int);//有可能報“超出表空間‘USERS’的空間限額”錯誤提示,那是因為lisi用戶可能還沒有表空間權限,執行賦予lisi用戶unlimited tablespace的權限,問題即可

解決。

  注意:表是屬於某個用戶的。而角色不屬於某個用戶。

  oracle三種登陸驗證機制

  操作系統驗證

  密碼文件驗證

  數據庫驗證

  對於絕大多少的普通用戶而言,數據庫啟動後,用戶登陸時采用的是數據庫驗證。

  而對應sys用戶,它的權限是最大的。它的權限甚至包括啟動和關閉數據庫。它在oracle數據庫還沒啟動時,就連接到oracle數據庫中去,進行啟動。這樣我們不難理解,sys的身份驗證不可能采用數據庫驗證,因為當時數據庫還沒有啟動呢。所以sys的身份驗證使用的是操作系統驗證和密碼文件驗證(這樣說不是很嚴格,應該是以SYSDBA和SYSOPER連接身份登陸都會以這兩種方式進行驗證)。

  當一個用戶連接數據庫的時候,客戶端首先連接到監聽服務,監聽把請求發送到數據庫,如果驗證通過了,以後就不需要監聽了,客戶端直接和數據庫實例通信。

  早期在linux和unix上運行的oracle,它有嚴格的啟動順序:先啟動監聽(只需要敲個命令即可,不需要什麼權限),後啟動數據庫實例(需要權限)

  執行的命令序列:lsnrctl start //啟動監聽服務

  sqlplus sys/oracle as sysdba//啟動數據庫實例的請求,發現以sysdba的身份連接,所以不進行數據庫驗證,而是采用操作系統和密碼文件驗證。如果驗證通過,運行啟動數據庫實例

  startup //啟動數據庫實例

  早期版本命令得這樣寫:

  lsnrctl start

  sqlplus /nolog

  conn sys/oracle as sysdba

  startup

  在windows下oracle的啟動過程,進行了傻瓜式的封裝:

  lsnrctl start

  oradim -starup -sid orcl

  補充:在連接到數據庫時,可以這樣寫:conn / as sysdba也可以連連上,甚至胡亂指定用戶名和密碼,如:conn abc/abc as sysdba都可以登陸。這是因為連接是以sysdba身份,首先采用操作系統驗證。在我們安裝數據庫時,會把當前系統的賬號添加到oracle的系統管理員組中去。按以上方式連接,它是默認根據系統的當前賬戶驗證通過的。把管理員組中的該系統賬號刪去後,他就會采用密碼驗證機制,就必須要指定用戶名和密碼了。

  問題:丟失密碼怎麼辦?

  我們知道如果普通用戶的密碼忘記了,我們可以管理員的身份對該用戶的密碼進行修改(無法查看,因為密碼都是加了密的,只能修改)

  可以在圖形化的工具下直接進行修改。也可以以命令的方式:

  alter user scott identified by tiger;

  在實際開發中,我們要把操作系統驗證給取消掉。那以後就會采用密碼驗證了。但是假如我們把密碼忘記了,又如何解決呢?

  我們可以把密碼文件刪掉,在生成一個密碼文件即可。

  找到密碼文件的所在地:..\db_2\database\pwdorcl.ora,紅色部分是該密碼文件命名的固定部分,orcl指的是數據庫的sid,可能不一樣

  刪除密碼文件後,再生成一個。使用orapwd命令,具體如下:

  orapwdfile=<密碼文件的全路徑,密碼文件的命名要按照先前> password=<指定的密碼> entries=<該密碼文件保存的DBA最大數量> force=只是否強制覆蓋文件操作

  示例:orapwd file=E:\oracle\ora92\database\pwdora9i.ora password=sys entries=10;

  使用以下語句查看在該密碼文件中放了多少特權用戶:

  select * from v$pwfile_users;

  創建用戶:

  create user 用戶名

  identified by 密碼

  default tablespace 表空間

  temporary tablespace 表空間

  quota 整數 K|M|unlimited on 表空間

  示例:

  create user abc

  identified by abc

  default tablespace users //用戶的默認表空間為users,在該表空間下用戶可以創建表

  temporary tablespace temp //用戶的臨時表空間,用於索引,排序等工作的臨時場所,相當於windows下的臨時文件夾

  quota 50M on users //指定users表空間的限額大小

  quota unlimited on temp; //指定臨時表空間的限額大小

  限制用戶

  用戶加鎖

  alter user 用戶名 account lock

  用戶解鎖

  alter user 用戶名 account unlock

  用戶口令即刻失效

  alter user 用戶名 password expire

  刪除用戶:

  drop user 用戶名 [cascade]

  cascade 用在當被刪除的用戶下還有未刪除的對象(如一些表)時,強制級聯刪除。它表示刪除用戶所有對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved