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