2.oracle的權限管理
oracle數據庫有最重要的兩個用戶,sys 和 system,sys擁有最高權限。
oracle權限分為兩種:一種是系統權限 ,一種是對象權限。
下面簡單的演示一下,用system用戶登錄並創建test用戶
現在用新創建的這個用戶登錄
提示沒有create session權限。
說明:新創建的用戶沒有任何權限,連登錄數據庫的權限都沒有
現在依舊用system用戶為test用戶賦予登錄權限
授權過后就可以登錄了,現在創建表試試
依舊是權限不足,沒有創建表的權限,又必須要管理員為其賦予創建表的權限。由於篇幅問題,這里就不演示了。
用戶可以用“select * from session_privs;”查詢自己擁有的權限。關於權限的查詢可以看下“http://hi.baidu.com/jason_xux/item/f970db14f772caf386ad4e46”。
到這兒想必大家知道權限是怎么一回事了吧。
(1)系統權限和對象權限
關於系統權限,顧名思義就是對系統一些操作的權限,比如剛剛的登錄的‘create session’就是一種系統權限,‘create table’‘create user’等都是一些比較常見的系統權限。
對象權限就是對對象的權限,當然這句是廢話,呵呵,所謂對象就是‘表’ ‘存儲過程’之類的。對象歸創建者所有,但是你要想要其他用戶可以訪問你創建的對象就必須你或者管理員賦予給他權限。
(2)角色
在實際應用中,一個用戶可能需要多種權限,比如一個軟件開發者需要登錄權限 創建表的權限 創建存儲過程 創建視圖之類的權限,如果一條一條的為該用戶賦予權限的話就會加重DBA的負擔,如果可以把這些權限一次性賦予給改用戶就好了,oracle提供了一種角色的東西(sql server也有),角色可以理解為權限的集合。
oracle內置了很多角色,用“select * from dba_roles;”可以查詢。“select * from user_role_privs;”查詢自己擁有的角色。
下面我們依舊來演示一下
首先切換到system用戶,收回test用戶的‘create session’權限,然后創建名為‘test_role’角色,將‘create session’‘create table’權限賦予‘test_role’角色,再將‘test_role’角色賦予test用戶,這樣test用戶就擁有‘create session’‘create table’兩種權限了。
(3)用戶schema
schema是數據對象的集合,這其實跟sql server里的數據庫差不多,只不過sql server將數據庫與用戶分離開來了,oracle中一般一個用戶對應一個schema,默認的缺省值和用戶名相同,當我們在訪問表的時候,默認會訪問和該用戶名一樣的schema里面的表,如我們用scott用戶執行“select * from emp”,這條查詢語句和“select * from scott.emp”是一樣的,既然一個用戶對應一個schema,那么這個schema是在什么時候創建的呢,schema好像並不是在創建user時就創建的,而是在該用戶創建了第一個對象之后才將schema真正創建的,只有user下存在對象,他對應的schema才會存在,如果user下不存在任何對象了,schema也就不存在了。
我在網上找到了一個很形象的比喻:
“我們可以把Database看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,Table可以看作是每個Schema中的床,Table(床)被放入每個房間中,不能放置在房間之外,那豈不是晚上睡覺無家可歸了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一樣,數據庫中存儲數據的基本單元是Table,現實中每個倉庫放置物品的基本單位就是床, User就是每個Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一對應的,每個user在沒有特別指定下只能使用自己schema(房間)的東西,如果一個user想使用其他schema(房間)的東西,那就要看那個schema(房間)的user(主人)有沒有給你這個權限了,或者看這個倉庫的老大(DBA)有沒有給你這個權限了。換句話說,如果你是某個倉庫的主人,那么這個倉庫的使用權和倉庫中的所有東西都是你的(包括房間),你有完全的操作權,可以扔掉不用的東西從每個房間,也可以放置一些有用的東西到某一個房間,你還可以給每個User分配具體的權限,也就是他到某一個房間能做些什么,是只能看(Read-Only),還是可以像主人一樣有所有的控制權(R/W),這個就要看這個User所對應的角色Role了。”---摘自網絡
(4)權限的級聯賦予與收回
如果所有的權限的賦予和收回都要DBA來操作的話,那確實對DBA殘酷了點兒,那能不能又DBA給某個用戶賦予某種權限 然后由該用戶在向其他用戶賦予該權限呢?答案是可以的。
下面繼續演示一下。
我們用system登錄,將test的test_role角色撤銷,這時test用戶不具備任何權限,創建用戶test1,再將test_role角色賦予給test用戶 但是后面跟了“with admin option”,這就意味着test用戶可以將test_role角色賦予給其他角色。我們用test用戶登錄,將test_role賦予給test1用戶,再用test1用戶登錄 果然可以成功,呵呵 這當然也是廢話。接下來用system用戶將test的test_role角色收回,這時test用戶不在可以登錄 ,但是test1用戶依然可以登錄。這就說明“with admin option”是可以將權限或者角色級聯傳遞,但是管理員收回時不會級聯收回。
注意:“with admin option”只能用於系統權限的傳遞。
下面看下對象權限的級聯傳遞
我們用scott用戶登錄,將dept的查詢權限交給test用戶,並允許test用戶繼續傳遞。用test用戶登錄,可以看到test是可以查詢scott的dept表的,繼續將scott的dept查詢權限賦予給test1,顯現現在test1也是可以查詢scott的dept。現在由scott將test的權限收回,現在test用戶明顯不能查詢了,再看test1,可以看到現在test1也不具有對scott的dept表查詢權限了。
注意:“with grant option”只能用於對象權限。查詢其他用戶的數據對象時,對象前必須加上其schema。如上面的“scott.dept”。
總結:系統權限收回時不會級聯收回,對象權限收回時會級聯收回。
好了,這篇就到這兒吧!下篇《oracle的體系結構之存儲結構(三)》