oracle資料庫許可權管理

來源:互聯網
上載者:User

標籤: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:資料定義語言 (Data Definition Language),指定是資料庫表的建立,刪除之類的操作。

  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的系統管理員組中去。按以上方式串連,它是預設根據系統的當前賬戶驗證通過的。把Administrator 群組中的該系統帳號刪去後,他就會採用密碼驗證機制,就必須要指定使用者名稱和密碼了。

  問題:丟失密碼怎麼辦?

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

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

  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 用在當被刪除的使用者下還有未刪除的對象(如一些表)時,強制串聯刪除。它表示刪除使用者所有對象。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.