標籤:into 使用者 div 使用者建立 trie 顯示 manager value 並且
許可權管理: oracle 9裡面預設的三個username和password: sys change_on_install //許可權最高的管理員 system manager //普通的管理員 scott tiger //普通使用者 在oracle 10中,仍然使用這三個使用者作為預設使用者。
但sys和system使用者的password不再預設。
許可權管理:
oracle 9裡面預設的三個username和password:
sys change_on_install //許可權最高的管理員
system manager //普通的管理員
scott tiger //普通使用者
在oracle 10中,仍然使用這三個使用者作為預設使用者。但sys和system使用者的password不再預設。在安裝資料庫的時候。能夠由使用者指定 。
從安全形度考慮,scott使用者預設被鎖定,所以要使用該使用者,
須要先解除鎖定。
注意:我們要使用oracle資料庫,至少要啟動兩個服務,一個是監聽服務,一個是資料庫執行個體。
建立使用者;
以系統管理員的身份登陸。
使用語句:create user lisi identified by lisi; //建立了一個叫lisi的使用者,password也為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。password也為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;語句提交。重新查詢,表中就有資料了。
假設要把某個許可權授予全部的使用者。能夠使用publickeyword:
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三種登陸驗證機制
作業系統驗證
password檔案驗證
資料庫驗證
對於絕大多少的普通使用者而言,資料庫啟動後。使用者登陸時採用的是資料庫驗證。
而相應sys使用者。它的許可權是最大的。它的許可權甚至包含啟動和關閉資料庫。它在oracle資料庫還沒啟動時,就串連到oracle資料庫中去,進行啟動。
這樣我們不難理解。sys的身分識別驗證不可能採用資料庫驗證,由於當時資料庫還沒有啟動呢。所以sys的身分識別驗證使用的是作業系統驗證和password檔案驗證(這樣說不是非常嚴格,應該是以SYSDBA和SYSOPER串連身份登陸都會以這兩種方式進行驗證)。
當一個使用者串連資料庫的時候。client首先串連到監聽服務,監聽把請求發送到資料庫。假設驗證通過了,以後就不須要監聽了。client直接和資料庫執行個體通訊。
早期在linux和unix上執行的oracle,它有嚴格的啟動順序:先啟動監聽(僅僅須要敲個命令就可以,不須要什麼許可權),後啟動資料庫執行個體(須要許可權)
啟動並執行命令序列:lsnrctl start //啟動監聽服務
sqlplus sys/oracle as sysdba//啟動資料庫執行個體的請求。發現以sysdba的身份串連,所以不進行資料庫驗證,而是採用作業系統和password檔案驗證。假設驗證通過。執行啟動資料庫執行個體
startup //啟動資料庫執行個體
早期版本號碼命令得這樣寫:
lsnrctl start
sqlplus /nolog
conn sys/oracle as sysdba
startup
在windows下oracle的啟動過程,進行了傻瓜式的封裝:
lsnrctl start
oradim -starup -sid orcl
補充:在串連到資料庫時。能夠這樣寫:conn / as sysdba也能夠連連上。甚至胡亂指定username和password,如:conn abc/abc as sysdba都能夠登陸。這是由於串連是以sysdba身份,首先採用作業系統驗證。
在我們安裝資料庫時。會把當前系統的帳號加入到oracle的系統管理員組中去。按以上方式串連。它是預設依據系統的當前賬戶驗證通過的。把Administrator 群組中的該系統帳號刪去後。他就會採用password驗證機制。就必需要指定username和password了。
問題:丟失password怎麼辦?
我們知道假設普通使用者的password忘記了,我們能夠管理員的身份對該使用者的password進行改動(無法查看,由於password都是加了密的,僅僅能改動)
能夠在圖形化的工具下直接進行改動。
也能夠以命令的方式:
alter user scott identified by tiger;
在實際開發中。我們要把作業系統驗證給取消掉。那以後就會採用password驗證了。
可是假如我們把password忘記了,又怎樣解決呢?
我們能夠把password檔案刪掉,在產生一個password檔案就可以。
找到password檔案的所在地:..\db_2\database\pwdorcl.ora,紅色部分是該password檔案命名的固定部分,orcl指的是資料庫的sid。可能不一樣
刪除password檔案後,再產生一個。使用orapwd命令,詳細例如以下:
orapwdfile=<password檔案的全路徑,password檔案的命名要依照先前> password=<指定的password> entries=<該password檔案儲存的DBA最大數量> force=僅僅是否強制覆蓋檔案操作
示範範例:orapwd file=E:\oracle\ora92\database\pwdora9i.ora password=sys entries=10;
使用下面語句查看在該password檔案裡放了多少特權使用者:
select * from v$pwfile_users;
建立使用者:
create user username
identified by password
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 username account lock
使用者解鎖
alter user username account unlock
使用者口令即刻失效
alter user username password expire
刪除使用者:
drop user username [cascade]
cascade 用在當被刪除的使用者下還有未刪除的對象(如一些表)時。強制串聯刪除。它表示刪除使用者全部對象。
oracle資料庫許可權管理