權限和角色的區(qū)別在那里。 \x0d\x0a 當剛剛建立用戶時,用戶沒有任何權限,也不能執(zhí)行任何操作。如果要執(zhí)行某種特定的數據庫操作,則必須為其授予系統的權限;如果用戶要訪問其它方案的對象,則必須為其授予對象的權限。為了簡化權限的管理,可以使用角色。\x0d\x0a權限是指執(zhí)行特定類型sql命令或是訪問其它方案對象的權利,包括系統權限和對象權限兩種。 \x0d\x0a\x0d\x0a系統權限 \x0d\x0a? 系統權限介紹 \x0d\x0a 系統權限是指執(zhí)行特定類型sql命令的權利。它用于控制用戶可以執(zhí)行的一個或是一組數據庫操作。比如當用戶具有create table權限時,可以在其方案中建表,當用戶具有create any table權限時,可以在任何方案中建表。oracle提供了100多種系統權限。 \x0d\x0a常用的有: \x0d\x0acreate session 連接數據庫 create table 建表 \x0d\x0acreate view 建視圖 create public synonym 建同義詞 \x0d\x0acreate procedure 建過程、函數、包 create trigger 建觸發(fā)器 \x0d\x0acreate cluster 建簇 \x0d\x0a\x0d\x0a? 顯示系統權限 \x0d\x0aoracle提供了100多種系統權限,而且oracle的版本越高,提供的系統權限就越多,我們可以查詢數據字典視圖system_privilege_map,可以顯示所有系統權限。 \x0d\x0aselect * from system_privilege_map order by name; \x0d\x0a\x0d\x0a? 授予系統權限 \x0d\x0a 一般情況,授予系統權限是由dba完成的,如果用其他用戶來授予系統權限,則要求該用戶必須具有grant any privilege的系統權限。在授予系統權限時,可以帶有with admin option選項,這樣,被授予權限的用戶或是角色還可以將該系統權限授予其它的用戶或是角色。為了讓大家快速理解,我們舉例說明: \x0d\x0a1.創(chuàng)建兩個用戶ken,tom。初始階段他們沒有任何權限,如果登錄就會給出錯誤的信息。 \x0d\x0acreate user ken identfied by ken; \x0d\x0a2 給用戶ken授權 \x0d\x0a1). grant create session, create table to ken with admin option; \x0d\x0a2). grant create view to ken; \x0d\x0a3 給用戶tom授權 \x0d\x0a我們可以通過ken給tom授權,因為with admin option是加上的。當然也可以通過dba給tom授權,我們就用ken給tom授權: \x0d\x0a1. grant create session, create table to tom; \x0d\x0a2. grant create view to ken; --ok嗎?不ok \x0d\x0a\x0d\x0a? 回收系統權限 \x0d\x0a 一般情況下,回收系統權限是dba來完成的,如果其它的用戶來回收系統權限,要求該用戶必須具有相應系統權限及轉授系統權限的選項(with admin option)?;厥障到y權限使用revoke來完成。 \x0d\x0a 當回收了系統權限后,用戶就不能執(zhí)行相應的操作了,但是請注意,系統權限級聯收回的問題?[不是級聯回收!] \x0d\x0asystem ---------ken ----------tom \x0d\x0a(create session)(create session)( create session) \x0d\x0a用system執(zhí)行如下操作: \x0d\x0arevoke create session from ken; --請思考tom還能登錄嗎? \x0d\x0a答案:能,可以登錄 \x0d\x0a\x0d\x0a對象權限 \x0d\x0a? 對象權限介紹 \x0d\x0a 指訪問其它方案對象的權利,用戶可以直接訪問自己方案的對象,但是如果要訪問別的方案的對象,則必須具有對象的權限。 \x0d\x0a比如smith用戶要訪問scott.emp表(scott:方案,emp:表) \x0d\x0a常用的有: \x0d\x0aalter 修改 delete 刪除 select 查詢 insert 添加 \x0d\x0aupdate 修改 index 索引 references 引用 execute 執(zhí)行 \x0d\x0a? 顯示對象權限 \x0d\x0a 通過數據字段視圖可以顯示用戶或是角色所具有的對象權限。視圖為dba_tab_privs \x0d\x0aSQL conn system/manager; \x0d\x0aSQL select distinct privilege from dba_tab_privs; \x0d\x0aSQL select grantor, owner, table_name, privilege from dba_tab_privs where grantee = 'BLAKE'; \x0d\x0a\x0d\x0a1.授予對象權限 \x0d\x0a在oracle9i前,授予對象權限是由對象的所有者來完成的,如果用其它的用戶來操作,則需要用戶具有相應的(with grant option)權限,從oracle9i開始,dba用戶(sys,system)可以將任何對象上的對象權限授予其它用戶。授予對象權限是用grant命令來完成的。 \x0d\x0a 對象權限可以授予用戶,角色,和public。在授予權限時,如果帶有with grant option選項,則可以將該權限轉授給其它用戶。但是要注意with grant option選項不能被授予角色。 \x0d\x0a1.monkey用戶要操作scott.emp表,則必須授予相應的對象權限 \x0d\x0a1). 希望monkey可以查詢scott.emp表的數據,怎樣操作? \x0d\x0a grant select on emp to monkey; \x0d\x0a2). 希望monkey可以修改scott.emp的表數據,怎樣操作? \x0d\x0a grant update on emp to monkey; \x0d\x0a3). 希望monkey可以刪除scott.emp的表數據,怎樣操作? \x0d\x0a grant delete on emp to monkey; \x0d\x0a4). 有沒有更加簡單的方法,一次把所有權限賦給monkey? \x0d\x0a grant all on emp to monkey; \x0d\x0a\x0d\x0a2.能否對monkey訪問權限更加精細控制。(授予列權限) \x0d\x0a1). 希望monkey只可以修改scott.emp的表的sal字段,怎樣操作? \x0d\x0a grant update on emp(sal) to monkey \x0d\x0a2).希望monkey只可以查詢scott.emp的表的ename,sal數據,怎樣操作? \x0d\x0a grant select on emp(ename,sal) to monkey \x0d\x0a... \x0d\x0a3.授予alter權限 \x0d\x0a如果black用戶要修改scott.emp表的結構,則必須授予alter對象權限 \x0d\x0aSQL conn scott/tiger \x0d\x0aSQL grant alter on emp to blake; \x0d\x0a當然也可以用system,sys來完成這件事。 \x0d\x0a4.授予execute權限 \x0d\x0a如果用戶想要執(zhí)行其它方案的包/過程/函數,則須有execute權限。 \x0d\x0a比如為了讓ken可以執(zhí)行包dbms_transaction,可以授予execute權限。 \x0d\x0aSQL conn system/manager \x0d\x0aSQL grant execute on dbms_transaction to ken; \x0d\x0a5.授予index權限 \x0d\x0a如果想在別的方案的表上建立索引,則必須具有index對象權限。 \x0d\x0a如果為了讓black可以在scott.emp表上建立索引,就給其index的對象權限 \x0d\x0aSQL conn scott/tiger \x0d\x0aSQL grant index on scott.emp to blake; \x0d\x0a6.使用with grant option選項 \x0d\x0a該選項用于轉授對象權限。但是該選項只能被授予用戶,而不能授予角色 \x0d\x0aSQL conn scott/tiger; \x0d\x0aSQL grant select on emp to blake with grant option; \x0d\x0aSQL conn black/shunping \x0d\x0aSQL grant select on scott.emp to jones; \x0d\x0a\x0d\x0a? 回收對象權限 \x0d\x0a 在oracle9i中,收回對象的權限可以由對象的所有者來完成,也可以用dba用戶(sys,system)來完成。 \x0d\x0a 這里要說明的是:收回對象權限后,用戶就不能執(zhí)行相應的sql命令,但是要注意的是對象的權限是否會被級聯收回?【級聯回收】 \x0d\x0a如:scott-------------blake--------------jones \x0d\x0a select on emp select on emp select on emp \x0d\x0aSQL conn scott/tiger@accp \x0d\x0aSQL revoke select on emp from blake \x0d\x0a請大家思考,jones能否查詢scott.emp表數據。 \x0d\x0a答案:查不了了(和系統權限不一樣,剛好相反)\x0d\x0a \x0d\x0a角色:\x0d\x0a角色就是相關權限的命令集合,使用角色的主要目的就是為了簡化權限的管理,假定有用戶a,b,c為了讓他們都擁有權限 \x0d\x0a1. 連接數據庫 \x0d\x0a2. 在scott.emp表上select,insert,update。 \x0d\x0a如果采用直接授權操作,則需要進行12次授權。 \x0d\x0a因為要進行12次授權操作,所以比較麻煩喔!怎么辦? \x0d\x0a\x0d\x0a 如果我們采用角色就可以簡化: \x0d\x0a 首先將creat session,select on scott.emp,insert on scott.emp, update on scott.emp授予角色,然后將該角色授予a,b,c用戶,這樣就可以三次授權搞定。 \x0d\x0a 角色分為預定義和自定義角色兩類: \x0d\x0a? 預定義角色 \x0d\x0a預定義角色是指oracle所提供的角色,每種角色都用于執(zhí)行一些特定的管理任務,下面我們介紹常用的預定義角色connect,resource,dba \x0d\x0a1.connect角色 \x0d\x0aconnect角色具有一般應用開發(fā)人員需要的大部分權限,當建立了一個用戶后,多數情況下,只要給用戶授予connect和resource角色就夠了,那么connect角色具有哪些系統權限呢? \x0d\x0aalter session \x0d\x0acreate cluster \x0d\x0acreate database link \x0d\x0acreate session \x0d\x0acreate table \x0d\x0acreate view \x0d\x0acreate sequence \x0d\x0a\x0d\x0a2.resource角色 \x0d\x0a resource角色具有應用開發(fā)人員所需要的其它權限,比如建立存儲過程,觸發(fā)器等。這里需要注意的是resource角色隱含了unlimited tablespace系統權限。 \x0d\x0aresource角色包含以下系統權限: \x0d\x0acreate cluster \x0d\x0acreate indextype \x0d\x0acreate table \x0d\x0acreate sequence \x0d\x0acreate type \x0d\x0acreate procedure \x0d\x0acreate trigger \x0d\x0a3.dba角色 \x0d\x0adba角色具有所有的系統權限,及with admin option選項,默認的dba用戶為sys和system,它們可以將任何系統權限授予其他用戶。但是要注意的是dba角色不具備sysdba和sysoper的特權(啟動和關閉數據庫)。 \x0d\x0a\x0d\x0a? 自定義角色 \x0d\x0a顧名思義就是自己定義的角色,根據自己的需要來定義。一般是dba來建立,如果用別的用戶來建立,則需要具有create role的系統權限。在建立角色時可以指定驗證方式(不驗證,數據庫驗證等)。 \x0d\x0a1.建立角色(不驗證) \x0d\x0a如果角色是公用的角色,可以采用不驗證的方式建立角色。 \x0d\x0a create role 角色名 not identified; \x0d\x0a2.建立角色(數據庫驗證) \x0d\x0a 采用這樣的方式時,角色名、口令存放在數據庫中。當激活該角色時,必須提供口令。在建立這種角色時,需要為其提供口令。 \x0d\x0acreate role 角色名 identified by 密碼; \x0d\x0a\x0d\x0a 角色授權 \x0d\x0a當建立角色時,角色沒有任何權限,為了使得角色完成特定任務,必須為其授予相應的系統權限和對象權限。 \x0d\x0a1.給角色授權 \x0d\x0a 給角色授予權限和給用戶授權沒有太多區(qū)別,但是要注意,系統權限的unlimited tablespace和對象權限的with grant option選項是不能授予角色的。 \x0d\x0aSQL conn system/manager; \x0d\x0aSQL grant create session to 角色名 with admin option \x0d\x0aSQL conn scott/tiger@myoral; \x0d\x0aSQL grant select on scott.emp to 角色名; \x0d\x0aSQL grant insert, update, delete on scott.emp to 角色名; \x0d\x0a通過上面的步驟,就給角色授權了。 \x0d\x0a2.分配角色給某個用戶 \x0d\x0a 一般分配角色是由dba來完成的,如果要以其它用戶身份分配角色,則要求用戶必須具有grant any role的系統權限。 \x0d\x0aSQL conn system/manager; \x0d\x0aSQL grant 角色名 to blake with admin option; \x0d\x0a因為我給了with admin option選項,所以,blake可以把system分配給它的角色分配給別的用戶。 \x0d\x0a\x0d\x0a? 刪除角色 \x0d\x0a 使用drop role,一般是dba來執(zhí)行,如果其它用戶則要求該用戶具有drop any role系統權限。 \x0d\x0aSQL conn system/manager; \x0d\x0aSQL drop role 角色名; \x0d\x0a問題:如果角色被刪除,那么被授予角色的用戶是否還具有之前角色里的權限? \x0d\x0a答案:不具有了 \x0d\x0a\x0d\x0a? 顯示角色信息 \x0d\x0a1.顯示所有角色 \x0d\x0aSQL select * from dba_roles; \x0d\x0a2.顯示角色具有的系統權限 \x0d\x0aSQL select privilege, admin_option from role_sys_privs where role='角色名'; \x0d\x0a3.顯示角色具有的對象權限 \x0d\x0a 通過查詢數據字典視圖dba_tab_privs可以查看角色具有的對象權限或是列的權限。 \x0d\x0a4.顯示用戶具有的角色,及默認角色 \x0d\x0a 當以用戶的身份連接到數據庫時,oracle會自動的激活默認的角色,通過查詢數據字典視圖dba_role_privs可以顯示某個用戶具有的所有角色及當前默認的角色 \x0d\x0aSQL select granted_role, default_role from dba_role_privs where grantee = ‘用戶名’; \x0d\x0a\x0d\x0a? 精細訪問控制 \x0d\x0a 精細訪問控制是指用戶可以使用函數,策略實現更加細微的安全訪問控制。如果使用精細訪問控制,則當在客戶端發(fā)出sql語句(select,insert,update,delete)時,oracle會自動在sql語句后追加謂詞(where子句),并執(zhí)行新的sql語句,通過這樣的控制,可以使得不同的數據庫用戶在訪問相同表時,返回不同的數據信息,如: \x0d\x0a用戶 scott blake jones \x0d\x0a策略 emp_access \x0d\x0a 數據庫表 emp \x0d\x0a如上圖所示,通過策略emp_access,用戶scott,black,jones在執(zhí)行相同的sql語句時,可以返回不同的結果。例如:當執(zhí)行select ename from emp; 時,根據實際情況可以返回不同的結果。 \x0d\x0a\x0d\x0a實際上角色有點像JAVA中的代碼重構.預定義角色和自定義角色就像是吃飯時的套餐和自助餐.
成都創(chuàng)新互聯公司專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站建設、網站建設、澤州網絡推廣、小程序定制開發(fā)、澤州網絡營銷、澤州企業(yè)策劃、澤州品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯公司為所有大學生創(chuàng)業(yè)者提供澤州建站搭建服務,24小時服務熱線:028-86922220,官方網址:www.cdcxhl.com
SQL create role test_role;
角色已創(chuàng)建
SQL grant create any table,create procedure to test_role;
授權成功。
上面就是 創(chuàng)建一個角色, 然后 授權給角色 的 代碼。
一般來說, 角色這種, 主要是方便長期的管理。
例如你管理一個倉庫的數據庫。
這個數據庫有一個用戶, 能夠訪問20張表。其中 只讀的有5張, 另外15張表是可讀寫的。
如果不用角色的話, 就是 執(zhí)行
grant ... to 那個用戶, 20 次。
或許你會覺得, 也就20次嘛, 可以接受的。
好, 公司規(guī)模擴大。 新招了一個人進來, 權限和以前那個人一樣。
那么你創(chuàng)建完那個用戶以后, 又要
grant ... to 那個新用戶, 20 次。
可能新來的人工資高了, 老員工不高興,跳槽了, 公司又招了一個。
你又要
grant ... to 新來的用戶, 20 次。
而使用角色的話, 你只需要一開始
grant ... to 角色, 20 次。
以后來一個員工
grant 角色 to 員工, 1 次 即可。
這個 角色的密碼, 一般是這種情況的:
一個用戶,有 默認角色 與 默認角色 2種。
默認角色,就是當用戶登錄的時候,就自動擁有的角色
非默認角色,就是當用戶登錄的時候,用戶需要通過 SET Role 來啟用這個角色。
例如,你同時被授予了 A,B,C 三個角色。 A 為默認角色。 B,C非默認。
你每次登錄, 自動被賦予了 A 這個角色。
B, C 這2個角色, 是要通過 SET Role 語句 啟用這個角色。
對于 oracle里角色的密碼
就是 當你 SET Role 啟用角色的時候,如果這個 角色是有密碼的, 你需要輸入 角色的密碼, 來啟用這個角色。