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