Oracle 权限介绍及管理
生活随笔
收集整理的這篇文章主要介紹了
Oracle 权限介绍及管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Oracle權限分為兩種:
分別是
系統權限(system privileges):? 包括創建/刪除表 , 創建刪除用戶等.
對象權限(object privileges):? 操控數據庫特定對象的內容,例如select某張表,插入數據到某張表等.
另外介紹個概念:
方案(schema): is a collection of database objects (used by a user.).
就是對象的集合啦,例如表,試圖,,索引的集合.
1.系統權限(system privileges)
對用戶和角色來講,oracle大概有100多個不同的系統權限,系統權限一般由dba提供.
典型的系統權限如下表:
1.1 創建用戶
語法如下:
CREATE USER username
IDENTIFIED BY passwd;
前提系你必須具有CREATE USER的權限, 一般只有DBA才有這個權限啦~
如下圖,創建1個用戶Bill
?
1.2 使用系統權限
一旦1個用戶被創建,DBA就能指定系統權限給這個用戶.
語法如下:
GRANT PRIVILEGE [privilege,.....]
TO? [user1,user2...| role, PUBLIC];
其中role就是角色啦, 至于PUBLIC就是之所有用戶啦,慎用啊.
一般來講1個程序員帳號需要如下權限:
CREATE SESSION (連接數據庫啊必要啊)/ CREATE TABLE/ CREATE SEQUENCE /CREATE VIEW/ CREATE PROCEDURE
下圖給用戶BILL分配這些權限:
?
一旦dba分配權限給用戶,用戶就立即可使用它們.
如下圖oracle這時已經可以用BILL賬戶登陸了:
?
1.2.1 查看用戶默認表空間和臨時表空間
可以查看user_users 視圖來查看用戶的默認表空間和臨時表空間:
?
可看出BILL賬戶的默認表空間是USERS, 臨時表空間是TEMP啦
1.2.2 修改用戶默認表空間和臨時表空間
注意這個動作一般只有DBA可以執行, ALTER USER的權限. 下圖把BILL賬戶的默認表空間改成了TS_EXAMPLE
這時我們用BILL賬戶嘗試建幾張表,
如下圖, 當建表語句沒有制定表空間時,那張表默認就存放在TS_EXAMPLE.
1003213
那么如果在建表時指定表空間呢,例如想在SYSTEM表空間建1張表,允吳允許咧?
答案是肯定的,1個具有CREATE TABLE權限的用戶可以在任何表空間建立新表. 如下圖
?
?1.2.3 表空間配額 quota
那么就是否1個居有CREATE table的user就可以無限制的使用任何表空間呢? 答案是否定的.
BILL雖然可以無限制地建新表,但他甚至無法插入數據到自己的默認表空間..
如上圖呢個悲劇,系統表示BILL賬戶沒有權限使用TS_EXAMPLE, 其實也就是說BILL在TS_EXAMPLE的配額空間為0;
這時是無法插入新數據的.(查詢另說)
可以查看user_tablespaces可以知道賬戶具有那些表空間的權限(插入數據的權限),如下圖,BILL沒有任何表空間的配額
?這時就需要給BILL分配表空間配額,語法如下:
alter user username quota xxx on tablespace_name;
或者在創建用戶時同時指定表空間配額:
CREATE USER username
IDENTIFIED BY passwd
DEFAULT TABLESPACE tp_name1
TEMPORARY TABLESPACE tmp_tp_name
QUOTA 100M on tp_name1
QUOTA 200M on tp_name2
PROFILE profilename;(PROFILE 在這里暫不討論)
又或者:
grant unlimited tablespace to username;
這樣的話所有表空間都無限制使用了,慎用啊
如下圖 我用SYS賬戶分配給BILL 100M表空間配額在TS_EXAMPLE, 和10M表空間配額在USER:
注意上圖的100m是指設定在100m 而不是增加100m哦
還有,ORACLE 吾允許分配臨時表空間的配額...臨時表空間自動供大家使用..
?
依家再用BILL查看user_tablespaces視圖,就可以見到bill有權限使用上面的兩個表空間了
?
至于要查看每個表空間具體有幾多配額,就需要查看user_ts_qaotas視圖,如下圖:
這時就應該可以往tb_bill_test插入數據了,重新執行一次insert 語句. 成功!
?
而且見到已經使用了8個block,? 64kb..
?
1.3 查看系統權限
用戶可以利用user_sys_privs視圖來查看自己有什么權限
? ?
可以見到 BILL的5個系統權限, 都是上面SYS分配給他的啊
?至于最后面那個ADMIN_OPTION 要注意,
這里的ADMIN_OPTION都是NO, 也就是說這些系統權限BILL都只能自己用啦,不能分配給別人用啦~
如果SYS分配這些權限給BILL同時帶上with admin option 這條語句, 那么BILL就有不但只可以使用這些權限,還可以分配給他人使用.
GRANT PRIVILEGE [privilege,.....]
TO? [user1,user2...| role, PUBLIC]
WITH ADMIN OPTION
1.4 回收系統權限
對應GRANT,回收的關鍵字是REVOKE啦,語法如下:
REVOKE PRIVILEGE [privilege,.....]
from? [user1,user2...| role, PUBLIC]
如下圖,我用SYS帳號回收了BILL的Create view的系統權限,那么bill就不能創建視圖了.
?
1.5 修改自己的密碼
BILL 是可以通過
Alter user BILL identified by xxxxxxx
來修改自己的密碼的,即使BILL沒有Alter USER的權限, 但是要修改其他選項的話,就必須要有ALTER USER權限了.
其他選項一般由DBA執行修改的啦~
2.角色(Role)
????? 角色是命名的可以授予用戶的相關權限的組,該方法使權限的授予,撤回更加容易管理.
2.1 創建角色:
? 語法:
?? CREATE ROLE rolename;
當然前提是有CREATE ROLE的權限啦,一般都是由DBA去執行啦~
而且角色名不能與存在的用戶名相同啊, oracle提示創建失敗的, 想想也是,不然分配權限時就會混繞了.
下圖我創建了1個角色manager:
2.2 分配權限給角色
?語法跟分配權限給用戶是一樣的,只不過用角色名去取代用戶名啦:
下圖: 我將create view, select any table 分給manager,
那么manager這個角色就可以創建試圖,和select任何模式(任何用戶)下的表了.
?
2.3 分配角色給用戶
到最后, 要將角色分給用戶,那么用戶就有了這個角色的權限.
語法:
grant rolename to username;
如下圖: 我將manager 角色分給BILL, 那么bill就擁有了manager角色的權限(create view, select any table)
?
可以見到,BILL雖然擁有了manager,BILL的系統權限并沒有增加.
因為角色權限視圖要聯合另外的試圖: user_role_privs ,來查看:
?
或者直接查看role_sys_privs視圖:
?
注意親測過:
在11g中用戶需要重新登陸才能使用新分配角色的權限..
如下圖,BILL已經可以查看scott用戶下的表了.
?
?2.4 回收角色.
這個一樣啦,語法
REVOKE rolename from username;
3.對象權限(object privileges)
???????? 對象權限是 指在指定的表,視圖,序列或過程上執行制定動作的權限或權利, 每1個對象都有1個特殊的可以授予的權限集. 下圖列出了各種對象的權限集合.
?
????? 用戶序列的權限只有select 和 alter. update, references和insert 權限可以通過指定1個可更新列的的子集被限制.
????? select的權限可以通過創建帶1個列子集的視圖并且只授予select權限來限制.
????? 1個同義詞上被授予的權限將轉換為由同義詞引用的基表的權限.
3.1 分配和查看對象權限
語法:
GRANT??? object_priv[(columns)]?? /? ALL
ON????????? object
to?????????? {user|role|PUBLIC}
[WITH GRANT OPTION]
其中
object_prive??? 是指被授予的對象權限,注意不帶對象名哦
ALL??????????????? 指定對象所有的對象權限
columns?????????? 從1個表或視圖中指定被授予權限的列
ON object?????? 是被授予權限所屬于的對象
TO????????????????? 指定權限被授予誰
PUBLIC??????????? 授予權限給所有用戶
WITH GRANT OPTION??? 允許被授予權限的人再授予這個權限給其他用戶或角色.
?3.1.1 表對象的權限
如下圖,首先我撤銷BILL的manager角色,這樣他是不能select SCOTT的表的
?
接下來我用SCOTT帳號分配emp表的select 權限給BILL
?
再分配update ename, deptno的權限給bill
?
這樣bill 能查看emp表內容,而且能update ename,deptno列,但是update sal列是失敗的
?
表的對象權限可以通過查看如下視圖.
作為GRANTEE
BILL 可以通過查看USER_TAB_PRIVS_RECD 或USER_TAB_PRIVS來查看分配了給自己的對象權限:
????????????? 通過查看USER_COL_PRIVS_RECD 來查看分配了給自己的對象的列的權限.
?
還可以通過查看ROLE_TAB_PRIVS 來查看自己的角色所擁有的對象權限和對象列的權限:
?
而作為GRANTOR
SCOTT可以通過USER_TAB_PRIVS_MADE??來查看自己分配了什么表對象權限給了什么用戶或角色.
???????? 可以通過USER_COL_PRIVS_MADE??來查看自己分配了什么列對象權限給了什么用戶或角色.
?
注意上圖TL是角色名
?3.1.2 PROCEDURE對象的權限
執行權限:
有上面的表格可見到, 對于PROCEDURE來講, 只有1個EXECUTE的權限..
例如BILL這時是無法執行scott的stored proc? USP_EMP_LIST的:
?
接下來我用scott帳號分配execute權限給BILL:
?
此時BILL就可以執行usp_emp_list 了, 而且也可以從user_tab_privs_recd里查看到相關信息.
?
?
查看代碼權限:
但是BILL要查看該stored proc的代碼要什么權限呢?
我們知道, 如果scott要查看自己的存儲過程代碼, 就要查看視圖usr_source.
然而如果BILL要查看scott的存儲過程,就必須要查看視圖dba_source了.
用dba分配這個視圖查看權限比BILL:
?
這樣的話, bill就可以查看scott的所有PROCEDURE代碼了,? 誰知道怎么分配指定1個存儲過程代碼查看權限的可告訴我~
?
那為什么不是只把scott的視圖user_source分配給BILL就可以了嗎?? 因為dba_source包括了其他人的信息.
答案是 user_, dba_, all_ 開頭的數據字典并不適用模式前序.
user_ 開頭的數據字典只適用于當前session查看當前用戶的信息. 不能share給其他用戶.
參考
https://forums.oracle.com/forums/thread.jspa?threadID=295697&messageID=3482583
即使scott能無錯執行分配user_source給bill:
?
但是BILL并不能查看scott.user_source...
?
修改權限:
我打算用BILL去修改scott的這個存儲過程USP_EMP_LIST;
?
當我執行這個腳本時, 提示我無權限了..
?
嘗試用scott分配alter權限給bill?
提示procedure只有execute 和 debug這個兩個對象權限..
親自測試過,? 修改他人的存儲過程需要的是CREATE ANY PROCEDURE
用sys帳號分配這個權限給BILL
?
bill就可以執行修改腳本了:
測試下 修改成功:
不過這個權限貌似很不安全 慎用啊~
?3.2 回收對象權限
呢個簡單啦:
Revoke ? object_priv[(columns)]?? /? ALL
ON????????? object
from ????????? {user|role|PUBLIC}
4.關于with grant option和 with admin option字句.
?????????? 關于呢兩個字句的作用上面已經介紹過了, 這里只不過做個實驗.
?????????? 若SCOTT將自己的表dept 的select權限分配給bill, 并且帶上with grant option字句.
???? 這時bill再將這個權限分配給Calvin, 這樣bill 和 Calvin都有權限查看這張表.
???? 但是當scott從bill回收這個權限時, calvin還有沒有這個權限呢?
1. scott 分配 select on dept 給bill:
?
?2.這時bill查看自己的對象權限,
?
?
3.BIll 再分給Calvin
?
4.Calvin 這時查看自己的權限:
?
可以見到 GRANTOR 系BILL啊, 分配的人是BILL啦
5. 這時Scott 回收bill的這個權限..
6.這時再查看calvin的權限:
?沒了...
也就是說,在Oracle里 A回收了B的某個權限,? 會同時回收B分配給其他用戶角色的對應權限...
?
?
分別是
系統權限(system privileges):? 包括創建/刪除表 , 創建刪除用戶等.
對象權限(object privileges):? 操控數據庫特定對象的內容,例如select某張表,插入數據到某張表等.
另外介紹個概念:
方案(schema): is a collection of database objects (used by a user.).
就是對象的集合啦,例如表,試圖,,索引的集合.
1.系統權限(system privileges)
對用戶和角色來講,oracle大概有100多個不同的系統權限,系統權限一般由dba提供.
典型的系統權限如下表:
1.1 創建用戶
語法如下:
CREATE USER username
IDENTIFIED BY passwd;
前提系你必須具有CREATE USER的權限, 一般只有DBA才有這個權限啦~
如下圖,創建1個用戶Bill
?
1.2 使用系統權限
一旦1個用戶被創建,DBA就能指定系統權限給這個用戶.
語法如下:
GRANT PRIVILEGE [privilege,.....]
TO? [user1,user2...| role, PUBLIC];
其中role就是角色啦, 至于PUBLIC就是之所有用戶啦,慎用啊.
一般來講1個程序員帳號需要如下權限:
CREATE SESSION (連接數據庫啊必要啊)/ CREATE TABLE/ CREATE SEQUENCE /CREATE VIEW/ CREATE PROCEDURE
下圖給用戶BILL分配這些權限:
?
一旦dba分配權限給用戶,用戶就立即可使用它們.
如下圖oracle這時已經可以用BILL賬戶登陸了:
?
1.2.1 查看用戶默認表空間和臨時表空間
可以查看user_users 視圖來查看用戶的默認表空間和臨時表空間:
?
可看出BILL賬戶的默認表空間是USERS, 臨時表空間是TEMP啦
1.2.2 修改用戶默認表空間和臨時表空間
注意這個動作一般只有DBA可以執行, ALTER USER的權限. 下圖把BILL賬戶的默認表空間改成了TS_EXAMPLE
這時我們用BILL賬戶嘗試建幾張表,
如下圖, 當建表語句沒有制定表空間時,那張表默認就存放在TS_EXAMPLE.
1003213
那么如果在建表時指定表空間呢,例如想在SYSTEM表空間建1張表,允吳允許咧?
答案是肯定的,1個具有CREATE TABLE權限的用戶可以在任何表空間建立新表. 如下圖
?
?1.2.3 表空間配額 quota
那么就是否1個居有CREATE table的user就可以無限制的使用任何表空間呢? 答案是否定的.
BILL雖然可以無限制地建新表,但他甚至無法插入數據到自己的默認表空間..
如上圖呢個悲劇,系統表示BILL賬戶沒有權限使用TS_EXAMPLE, 其實也就是說BILL在TS_EXAMPLE的配額空間為0;
這時是無法插入新數據的.(查詢另說)
可以查看user_tablespaces可以知道賬戶具有那些表空間的權限(插入數據的權限),如下圖,BILL沒有任何表空間的配額
?這時就需要給BILL分配表空間配額,語法如下:
alter user username quota xxx on tablespace_name;
或者在創建用戶時同時指定表空間配額:
CREATE USER username
IDENTIFIED BY passwd
DEFAULT TABLESPACE tp_name1
TEMPORARY TABLESPACE tmp_tp_name
QUOTA 100M on tp_name1
QUOTA 200M on tp_name2
PROFILE profilename;(PROFILE 在這里暫不討論)
又或者:
grant unlimited tablespace to username;
這樣的話所有表空間都無限制使用了,慎用啊
如下圖 我用SYS賬戶分配給BILL 100M表空間配額在TS_EXAMPLE, 和10M表空間配額在USER:
注意上圖的100m是指設定在100m 而不是增加100m哦
還有,ORACLE 吾允許分配臨時表空間的配額...臨時表空間自動供大家使用..
?
依家再用BILL查看user_tablespaces視圖,就可以見到bill有權限使用上面的兩個表空間了
?
至于要查看每個表空間具體有幾多配額,就需要查看user_ts_qaotas視圖,如下圖:
這時就應該可以往tb_bill_test插入數據了,重新執行一次insert 語句. 成功!
?
而且見到已經使用了8個block,? 64kb..
?
1.3 查看系統權限
用戶可以利用user_sys_privs視圖來查看自己有什么權限
? ?
可以見到 BILL的5個系統權限, 都是上面SYS分配給他的啊
?至于最后面那個ADMIN_OPTION 要注意,
這里的ADMIN_OPTION都是NO, 也就是說這些系統權限BILL都只能自己用啦,不能分配給別人用啦~
如果SYS分配這些權限給BILL同時帶上with admin option 這條語句, 那么BILL就有不但只可以使用這些權限,還可以分配給他人使用.
GRANT PRIVILEGE [privilege,.....]
TO? [user1,user2...| role, PUBLIC]
WITH ADMIN OPTION
1.4 回收系統權限
對應GRANT,回收的關鍵字是REVOKE啦,語法如下:
REVOKE PRIVILEGE [privilege,.....]
from? [user1,user2...| role, PUBLIC]
如下圖,我用SYS帳號回收了BILL的Create view的系統權限,那么bill就不能創建視圖了.
?
1.5 修改自己的密碼
BILL 是可以通過
Alter user BILL identified by xxxxxxx
來修改自己的密碼的,即使BILL沒有Alter USER的權限, 但是要修改其他選項的話,就必須要有ALTER USER權限了.
其他選項一般由DBA執行修改的啦~
2.角色(Role)
????? 角色是命名的可以授予用戶的相關權限的組,該方法使權限的授予,撤回更加容易管理.
2.1 創建角色:
? 語法:
?? CREATE ROLE rolename;
當然前提是有CREATE ROLE的權限啦,一般都是由DBA去執行啦~
而且角色名不能與存在的用戶名相同啊, oracle提示創建失敗的, 想想也是,不然分配權限時就會混繞了.
下圖我創建了1個角色manager:
2.2 分配權限給角色
?語法跟分配權限給用戶是一樣的,只不過用角色名去取代用戶名啦:
下圖: 我將create view, select any table 分給manager,
那么manager這個角色就可以創建試圖,和select任何模式(任何用戶)下的表了.
?
2.3 分配角色給用戶
到最后, 要將角色分給用戶,那么用戶就有了這個角色的權限.
語法:
grant rolename to username;
如下圖: 我將manager 角色分給BILL, 那么bill就擁有了manager角色的權限(create view, select any table)
?
可以見到,BILL雖然擁有了manager,BILL的系統權限并沒有增加.
因為角色權限視圖要聯合另外的試圖: user_role_privs ,來查看:
?
或者直接查看role_sys_privs視圖:
?
注意親測過:
在11g中用戶需要重新登陸才能使用新分配角色的權限..
如下圖,BILL已經可以查看scott用戶下的表了.
?
?2.4 回收角色.
這個一樣啦,語法
REVOKE rolename from username;
3.對象權限(object privileges)
???????? 對象權限是 指在指定的表,視圖,序列或過程上執行制定動作的權限或權利, 每1個對象都有1個特殊的可以授予的權限集. 下圖列出了各種對象的權限集合.
?
????? 用戶序列的權限只有select 和 alter. update, references和insert 權限可以通過指定1個可更新列的的子集被限制.
????? select的權限可以通過創建帶1個列子集的視圖并且只授予select權限來限制.
????? 1個同義詞上被授予的權限將轉換為由同義詞引用的基表的權限.
3.1 分配和查看對象權限
語法:
GRANT??? object_priv[(columns)]?? /? ALL
ON????????? object
to?????????? {user|role|PUBLIC}
[WITH GRANT OPTION]
其中
object_prive??? 是指被授予的對象權限,注意不帶對象名哦
ALL??????????????? 指定對象所有的對象權限
columns?????????? 從1個表或視圖中指定被授予權限的列
ON object?????? 是被授予權限所屬于的對象
TO????????????????? 指定權限被授予誰
PUBLIC??????????? 授予權限給所有用戶
WITH GRANT OPTION??? 允許被授予權限的人再授予這個權限給其他用戶或角色.
?3.1.1 表對象的權限
如下圖,首先我撤銷BILL的manager角色,這樣他是不能select SCOTT的表的
?
接下來我用SCOTT帳號分配emp表的select 權限給BILL
?
再分配update ename, deptno的權限給bill
?
這樣bill 能查看emp表內容,而且能update ename,deptno列,但是update sal列是失敗的
?
表的對象權限可以通過查看如下視圖.
作為GRANTEE
BILL 可以通過查看USER_TAB_PRIVS_RECD 或USER_TAB_PRIVS來查看分配了給自己的對象權限:
????????????? 通過查看USER_COL_PRIVS_RECD 來查看分配了給自己的對象的列的權限.
?
還可以通過查看ROLE_TAB_PRIVS 來查看自己的角色所擁有的對象權限和對象列的權限:
?
而作為GRANTOR
SCOTT可以通過USER_TAB_PRIVS_MADE??來查看自己分配了什么表對象權限給了什么用戶或角色.
???????? 可以通過USER_COL_PRIVS_MADE??來查看自己分配了什么列對象權限給了什么用戶或角色.
?
注意上圖TL是角色名
?3.1.2 PROCEDURE對象的權限
執行權限:
有上面的表格可見到, 對于PROCEDURE來講, 只有1個EXECUTE的權限..
例如BILL這時是無法執行scott的stored proc? USP_EMP_LIST的:
?
接下來我用scott帳號分配execute權限給BILL:
?
此時BILL就可以執行usp_emp_list 了, 而且也可以從user_tab_privs_recd里查看到相關信息.
?
?
查看代碼權限:
但是BILL要查看該stored proc的代碼要什么權限呢?
我們知道, 如果scott要查看自己的存儲過程代碼, 就要查看視圖usr_source.
然而如果BILL要查看scott的存儲過程,就必須要查看視圖dba_source了.
用dba分配這個視圖查看權限比BILL:
?
這樣的話, bill就可以查看scott的所有PROCEDURE代碼了,? 誰知道怎么分配指定1個存儲過程代碼查看權限的可告訴我~
?
那為什么不是只把scott的視圖user_source分配給BILL就可以了嗎?? 因為dba_source包括了其他人的信息.
答案是 user_, dba_, all_ 開頭的數據字典并不適用模式前序.
user_ 開頭的數據字典只適用于當前session查看當前用戶的信息. 不能share給其他用戶.
參考
https://forums.oracle.com/forums/thread.jspa?threadID=295697&messageID=3482583
即使scott能無錯執行分配user_source給bill:
?
但是BILL并不能查看scott.user_source...
?
修改權限:
我打算用BILL去修改scott的這個存儲過程USP_EMP_LIST;
?
當我執行這個腳本時, 提示我無權限了..
?
嘗試用scott分配alter權限給bill?
提示procedure只有execute 和 debug這個兩個對象權限..
親自測試過,? 修改他人的存儲過程需要的是CREATE ANY PROCEDURE
用sys帳號分配這個權限給BILL
?
bill就可以執行修改腳本了:
測試下 修改成功:
不過這個權限貌似很不安全 慎用啊~
?3.2 回收對象權限
呢個簡單啦:
Revoke ? object_priv[(columns)]?? /? ALL
ON????????? object
from ????????? {user|role|PUBLIC}
4.關于with grant option和 with admin option字句.
?????????? 關于呢兩個字句的作用上面已經介紹過了, 這里只不過做個實驗.
?????????? 若SCOTT將自己的表dept 的select權限分配給bill, 并且帶上with grant option字句.
???? 這時bill再將這個權限分配給Calvin, 這樣bill 和 Calvin都有權限查看這張表.
???? 但是當scott從bill回收這個權限時, calvin還有沒有這個權限呢?
1. scott 分配 select on dept 給bill:
?
?2.這時bill查看自己的對象權限,
?
?
3.BIll 再分給Calvin
?
4.Calvin 這時查看自己的權限:
?
可以見到 GRANTOR 系BILL啊, 分配的人是BILL啦
5. 這時Scott 回收bill的這個權限..
6.這時再查看calvin的權限:
?沒了...
也就是說,在Oracle里 A回收了B的某個權限,? 會同時回收B分配給其他用戶角色的對應權限...
?
?
總結
以上是生活随笔為你收集整理的Oracle 权限介绍及管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决 Oralce 执行set auto
- 下一篇: 什么是缓存里的脏数据.