程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 用戶與權限管理,用戶權限管理

用戶與權限管理,用戶權限管理

編輯:Oracle教程

用戶與權限管理,用戶權限管理


用戶和權限是Oracle數據庫系統最基本的安全管理機制。

用戶通過SQL*Plus或者應用程序登錄Oracle時,必須提供一個脹號,即用戶名和口令。
登錄後還必須有一定的權限才能完成相應的操作。
用戶具有什麼樣的權限,才能完成什麼樣的操作。

如果用戶希望訪問數據庫,首先應該由數據庫管理員為其分配一個賬號,然後再為它指定一定的權限,這樣用戶才能完成相應的操作。
數據庫管理員還可以通過PROFILE對用戶使用口令及系統資源的情況進行控制

用戶管理

用戶是一個數據庫對象,是一系列數據庫對象和權限的統稱

用戶所有的操作默認在自己的模式下進行,模式是一個用戶所擁有的數據庫對象的集合,每個用戶都有自己的模式,用戶與模式之間是一一對應的,模式的名字與用戶名相同。
例如, SCOTT 用戶的模式為SCOTT,
在這個模式中包含了用戶SCOTT擁有的所有數據庫對象,包括表、視圖、索引、存儲程序等。
用戶的數據庫對象和數據分布在表空間中,每個用戶都有默認的表空間。

默認的表空間在創建用戶時指定,如果不指定,那麼SYSTEM表空間將被指定為該用戶的默認表空間。

數據庫中有哪些用戶

在Oracle數據庫中有三類用戶,一類是sysdba ,一類是sysoper ,第三類是普通用戶

其中
前兩類用戶稱之為特權用戶,它們擁有對所有數據庫對象的一切權限,包括數據庫本身

sys 用戶同時具有sysdba和sysoper兩種權限,它在創建數據庫時自動產生,不需要手工創建。
特權用戶的口令一方面存放在數據庫中,另一方面存儲在口令文件中。

如果為一個普通用戶指定了sysdba或sysoper權限,那麼這個用戶也將成為特權用戶。
特權用戶的信息可以從動態性能視圖v$pwfile_users 中獲得
一個用戶只要具有這兩種權限,就可以以“ as sysdba ”或者“ as sysoper”的方式登錄數據庫服務器。
例如:

sqlplus scott/tiger as sysdba

如果用戶以“ as sysdba” 方式登錄數據庫服務器,那麼他將成為sys 用戶。

如果以“ as sysoper”的方式登錄,那麼他將成為PUBLIC用戶。
這兩種權限的范圍大小是不一樣的,例如,如果一個用戶以“ as sysdba”方式登錄,那麼他可以無條件地訪問任何用戶的數據,例如:

sqlplus scott/tiger as sysdba

select * from userl.tl;

如果一個用戶以“as sysoper”方式登錄,那麼他是不能訪問其他用戶的數據的。

在後面的內容中,將對這兩種權限進行詳細的比較。
普通用戶一般由sys用戶創建,這類用戶的權限比較小,一般只限於訪問自己模式中的數據庫對象。

普通用戶如果希望對數據庫進行其他的訪問,就需要具有相應的權限。

如何創建用戶

數據庫系統在運行的過程中,往往要根據實際需求創建用戶,然後為用戶指定適當的權限。
創建用戶的操作一般只能由sys 用戶完成,如果普通用戶也要創建用戶,必須具有一個系統權限,即CREATE USER
創建用戶的命令是CREATE USER ,創建用戶所包含的內容包括為用戶指定用戶名、口令、默認表空間、存儲空間配額等。
其中用戶名是代表用戶賬號的標識符,它的命名規則是:
·必須以字母開始
·長度為l ~ 30 個字符
·從第二個字符開始,可以包括大小寫字母、數字、一、$和#等字符。
.大寫和小寫是相同的
用來創建用戶的CREATE USER命令的完整語拉格式為:

CREATE USER 用戶名 IDENTIFIED BY "口令"
DEFAULT TABLESPACE 表空間
TEMPORARY TABLESPACE 臨時表空間
QUOTA 空間配額大小 ON 表空間
PASSWORD EXPIRE
ACCOUNT LOCK | UNLOCK

其中DEFAULT TABLESPACE用來為用戶指定默認表空間,如果不指定,那麼SYSTEM表空間將被指定為這個用戶的默認表空間。
如果不特別指定,用戶創建的表、索引等數據庫對象就位於默認表空間中。
為了提高數據庫的性能,同時為了方便管理數據, Oracle建議為用戶指定一個默認表空間。
TEMPORARY TABLESPACE用於為用戶指定臨時表空間。

在一個數據庫中可以創建多個臨時表空間,為每個用戶可以指定不同的臨時表空間。
還可以把多個臨時表空間組織為一個表空間組,把這個表空間組作為整個數據庫或者某個用戶的默認臨時表空間。
QUOTA子句用於為用戶在表空間上指定空間配額。

盡管為用戶指定了默認表空間,但是用戶在這個表空間上還不能創建數據庫對象,因為它在這個表空間上沒有可支配的存儲空間。
空間配額以字節、KB 、MB等為單位,還可以指定為UNLIMITED ,即無限制的空間配額

如果希望用戶在所有表空間上都具有無限制的空間配額,只要為其指定UNLIMITED TABLESPACES系統權限即可。
PASSWORD EXPIRE用於指定用戶的口令過期,用戶在第一次登錄數據庫服務器時必須修改自己的口令。
在創建用戶賬號時,用戶的初始口令是由管理員指定的。

如果以口令過期的方式強迫用戶修改自己的口令,這樣將使用戶的賬號更加安全。
ACCOUNT子句用於指定用戶賬號的狀態,如果為UNLOCK ,這個用戶就能夠登錄數據庫服務器,這是默認設置。
如果為LOCK ,則為鎖定狀態。
例如,下面的CREATE語句用於創建用戶user1,並為其指定相關屬性:

CREATE USER user1 IDENTIFIED BY "123"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users
PASSWORD EXPIRE
ACCOUNT LOCK;

如何在創建用戶時沒有指定QUOTA大小可以在後面添加:

例如:

alter user user1 quota 10M on users;  
alter user user1 quota unlimited on users;
grant unlimited tablespace to user1;

用戶被創建之後,還沒有任何權限,甚至不能登錄數據庫,只有當sys用戶為它指定了一定的權限後,它才能對數據庫進行訪問。
用戶的相關信息可以從數據字典視圖dba_users 中獲得

例如,下面的SELECT語句用於查詢當前數據庫中所有用戶的名稱、口令、默認表空間和賬號狀態等信息:

SELECT username, password, account_status, default_tablespace FROM dba_users WHERE username='USER1';

在列出的用戶中,包括特權用戶、數據庫預創建的用戶和剛剛手工創建的用戶。

用戶的口令都是經過加密的,在較早版本的數據庫中,可以顯示加密的口令,在現在的版本中不顯示口令。
如果不特別指定,用戶的默認表空間是SYSTEM表空間。

如何修改用戶的信息

為了防止不法之徒盜取用戶的口令,用戶應該經常改變自己的口令。

用戶的口令不應該是類似1234 、abed這樣簡單的字符串,更不要指定為自己生日和姓名,也不要指定為一個英文單詞,因為這樣的口令很容易被破譯。
一個好的口令應該包括大小寫字母、數字、_、&、%、$等各種符號在內的混合字符串
統計表明,一個口令中包含的成分越復雜,就越難破譯。
修改用戶口令的操作一般由用戶自己完成, sys用戶可以無條件修改任何一個用戶的口令。
普通用戶只能修改自己的口令,如果要修改其他用戶的口令,必須具有ALTER ANY USER這個系統權限。
修改用戶口令的命令是ALTER USER 。

修改用戶口令的ALTER USER命令格式為:

ALTER USER 用戶名 IDENTIFIED BY "新口令";

例如,將剛才創建的用戶user1的口令改為“ book ”,對應的ALTER USER語句為:

ALTER USER user1 IDENTIFIED BY "book";

除了SQL命令ALTER USER 以外, SQL*Plus也提供了一個PASSWORD命令,可以用來修改用戶的口令
利用SQL*Plus 的這條命令, sys用戶可以修改其他用戶的口令,普通用戶可以修改自己的口令,在授權的情況下也可以修改其他用戶的口令。
一個用戶在修改自己的口令時,必須知道自己以前的口令
這條命令只有一個參數,就是用戶名,如果默認了這個參數,就修改自己的口令。
以下是用戶scott修改自己的口令的情況:

PASSWORD scott

Al,TER USER命令除了修改用戶口令外.還可以修改用戶的默認表空間、存儲空間配額、賬號狀態等信息。
例如, 下面的語句用於鎖定用戶scott:

ALTER USER scott ACCOUNT LOCK;

下面的語句用於修改用戶user1默認表空間、臨時表空間,並將該用戶在表空間users上的空間配額修改為無限制:

ALTER USER userl
DEFAULT TABLESPACE tsl
TEMPORARY TABLESPACE tsl
QUOTA UNLIMITED ON tsl;

如何刪除用戶

一個用戶不再訪問數據庫系統時,應該將這個用戶及時地從數據庫中刪除,否則可能會有安全隱患。
一個更好的做法是先將這個用戶鎖定,過一段時間如果確定這個用戶不再需要,再將其刪除。
刪除用戶的操作一般由sys用戶完成,也可以由具有DROP USER權限的用戶來完成。

一個用戶被刪除後,這個用戶本身的信息,以反它所擁有的數據庫對象的信息都將從數據字典中被刪除。
刪除用戶的命令是DROP USER 。

這條命令的語法格式為:

DROP USER 用戶名;

例如,要刪除用戶USER2,可以執行下面的DROP USER語句:

DROP USER user2;

需要注意的是,如果在一個用戶的模式中已經包含一些數據庫對象,那麼這個用戶是不能被直接刪除的,在刪除用戶時系統將顯示類似以下的信息:

ORA-01922: 必須指定 CASCADE 以刪除 'USER1'

出現錯誤信息的原因是在用戶USER1的模式中包含某些數據庫對象,所以不能直接刪除。

如果要強制刪除用戶,可以在DROP USER命令中使用CASCADE選項,這樣用戶以及所擁有的數據庫對象將一起被刪除。
例如,刪除用戶scott可以執行下面的語句:

DROP USER user1 CASCADE;

用戶的權限管理

Oracle數據庫對用戶的權限有著嚴密的規定,如果沒有權限,用戶將無法完成任何操作,甚至不能登錄數據庫

例如,剛剛創建的用戶user1在試圖登錄數據庫時,將看到以下錯誤信息:

ORA-01045: user USER1 lacks CREATE SESSION privilege; logon denied

也就是說,用戶若要登錄數據庫,必須具有CREATE SESSION權限

用戶權限有兩類,即系統權限和對象權限。
系統權限主要是指對數據庫對象的創建、刪除、修改的權限,對數據庫進行創建、備份等權限,而對象權限主要是指對數據庫對象中的數據的訪問權限。
系統權限一般由sys用戶指定,也可以由具有特權的其他用戶授予。
對象權限一般由數據庫對象的所有者授予用戶,也可以由sys用戶指定,或者由具有該對象權限的其他用戶授予。

系統權限的管理

系統權限是與數據庫安全有關的最重要的權限,這類權限一般是針對數據庫管理員的

系統權限的管理主要包括權限的分配、回收和查詢等操作
Oracle 11g提供了200余種系統權限,下表 列出了與用戶有關的最重要的幾種系統權限。

對於表、視圖、會話、用戶、觸發器這些數據庫對象,有關的系統權限包括創建、刪除和修改它們的權限,相關的命令分別是CREATE 、DROP和ALTER 。
表、視圖、觸發器、存儲程序等對象是與用戶有關的,在默認情況下對這些對象的操作都是在當前用戶自己的模式下進行的。
如果要在其他用戶的模式下操作這些類型的對象,需要具有對應的ANY權限

例如,要能夠在其他用戶的模式下創建表,當前用戶必須具有CREATE ANY TABLE系統權限,如果希望能夠在其他用戶的模式下刪除表,必須具有DROP ANY TABLE 系統權限等。
系統權限一般有三種授予者,一種是sys用戶,即數據庫管理員,這是最主要的一種授予者,大部分的系統權限管理工作都由sys用戶完成。
第二種是具有特權的普通用戶,普通用戶一旦具有了sysdba或者sysoper特權,也可以管理系統權限。
第三種是被授予了某種系統權限的用戶,系統允許它把所擁有的系統權限再授予其他用戶。
為用戶授予權限的GRANT命令的語法格式為:

GRANT 權限列表 TO 用戶列表 WITH ADMIN OPTION;

GRANT命令執行後,所有指定用戶都將獲得指定的權限。

如果希望把一個權限授予所有用戶,可以用PUBLIC代替所有的用戶名
選項“ WITH ADMIN OPTION”的功能是使得權限的獲得者可以再將權限授予其他用戶。
例如,剛剛創建用戶userl 時,這個用戶沒有任何權限。

如果把CREATE SESSION權限授予這個用戶,那麼這個用戶就可以登錄數據庫了。
如果再把CREATE TABLE權限授予這個用戶,那麼他就可以在自己的模式中創建表了。
授予這兩個權限的語句為:

GRANT CREATE SESSION, CREATE TABLE TO user1;

用戶在登錄數據庫系統後應該可以創建表了,但是當這個用戶在自己的模式中創建表時,
將遇到以下的錯誤:

ORA-01950: 對表空間 'USERS' 無權限

出錯的原因是當前用戶在他的默認表空間中沒有空間配額,即沒有可以使用的存儲空間,所以無法創建表。
這時需要為該用戶指定空間配額,或者為這個用戶指定UNLIMITED TABLESPACE系統權限。
所以為了使一個用戶可以操作數據庫,至少應該把上述三個權限授予這個新用戶。
例如, 下列的授權語句使得所有用戶都可以使用無限制的磁盤空間:

GRANT UNLIMITED TABLESPACE TO PUBLIC;

如果將ALTER USER的系統權限授予某用戶,那麼它就可以修改其他用戶的信息。

現在考察下列權限操作的語句序列 :

CONN / AS SYSDBA

GRANT ALTER USER TO user1;

CONN user1/123

ALTER USER scott IDENTIFIED BY new_tiger;

如果上述語句都執行成功,那麼用戶scott的口令將被修改為“new_tiger”。

首先以特權用戶sys登錄,並將系統權限ALTER USER授予用戶userl。 
然後以用戶userl 登錄,這個用戶就可以修改其他用戶的信息了。
回收系統權限的命令是REVOKE ,這條命令一般由SYS 用戶執行。

普通用戶如果要回收其他用戶的權限,則他必須具有“GRANT ANY PRIVILEGE”這個系統權限。
如果一個用戶在接受某個系統權限時是以“ WITH ADMIN OPTION ”方式接受的,他隨後又將這個系統權限授予了其他用戶,那麼他也可以將這個系統權限從其他用戶回收。
REVOKE的語法格式為:

REVOKE 系統權限列表 FROM 用戶列表;

如果要從所有用戶回收某個系統權限,可以用PUBLIC代替所有的用戶名

這裡的系統權限也是有PUBLIC授予的。

例如,要將剛才授予用戶user1的系統權限CREATE SESSION和CREATE TABLE 回收,可以執行下面的REVOKE語句:

REVOKE CREATE SESSION, CREATE TABLE FROM user1;

這樣,用戶USER1就不能登錄數據庫,更不能創建表了。

需要注意的是系統權限可以轉授,但是回收時不能間接回收

假設有三個用戶,第一個用戶將某個系統權限以“WITH ADMIN OPTION”的方式授予第二個用戶,第二個用戶又將這個權限授予第三個用戶,那麼當第一個用戶從第二個用戶回收這個權限時,並不能同時從第三個用戶回收這個權限,第三個用戶這時仍然具有這個權限。
現在考慮下列權限操作的語句序列:

CONN AS sysdba
GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;
CREATE USER user2 IDENTIFIED BY "1234";
CONN user1/1234
GRANT CREATE SESSION,CREATE TABLE TO user2;
CONN sys/1234 AS sysdba
REVOKE CREATE SESSION,CREATE TABLE FROM user1;
CONN user2/1234
SELECT * FROM user_sys_privs

對象權限的管理

對象權限主要是對數據庫對象中的數據的訪問權限,這類權限主要是針對普通用戶的。

下表列出了最主要對象權限。

SELECT 、INSERT 、DELETE和UPDATE權限分別是指對數據庫對象中的數據的查詢、插入、刪除和修改的權限。
對於表和視圖來說,查詢和刪除操作是整行進行的,而插入和修改卻可以在一行的某個列上進行,所以在指定權限時, SELECT和DELETE權限只要指定所要訪問的表就可以了,而INSERT和UPDATE權限還可以進一步指定是對哪個列的權限
REFERENCES權限是指可以與一個表建立關聯關系的權限,如果具有了這個權限,當前用戶就可以通過自己的一個表中的外鍵,與對方的表建立關聯。
關聯關系是通過主鍵和外鍵進行的,所以在授予這個權限時,可以指定表中的列,也可以不指定。
EXECUTE權限是指可以執行存儲函數、存儲過程和程序包的權限。

有了這個權限,一個用戶就可以執行另一個用戶的存儲程序。
當一個用戶獲得另一個用戶的某個對象的訪問權限後,以“用戶名.對象名”的形式訪問這個數據庫對象。
一個用戶所擁有的對象和可以訪問的對象是不同的,這一點在數據字典視圖中也有所反映
在默認情況下用戶可以直接訪問自己模式中的數據庫對象,但是要訪問其他用戶所擁有的對象,就必須具有相應的對象權限。
例如,用戶user1要查詢用戶scott的表emp 中的數據,就必須具有對表emp的SELECT權限。
從數據字典視圖user_objects 中可以獲得當前用戶所擁有的全部數據庫對象的信息,而從數據字典視圖all_objects 中則可以獲得當前用戶所能訪問的全部對象的信息。
對象權限的授予一般由對象的所有者完成,也可以由sys用戶,或者由具有某對象權限的用戶授予,但最好由對象的所有者完成。
授予對象權限的命令是GRANT ,回收權限的命令是REVOKE ,與系統權限的操作相比,這兩條命令有些不同的地方。
授予對象權限的GRANT命令語法格式為:

GRANT 對象權限列表 ON 對象名 TO 用戶列表 WITH GRANT OPTION;

在授予對象權限時,不僅要說明是什麼權限,還要指定是對哪個對象的訪問權限,這是與系統權限的授予不同的地方。
例如,假設當前用戶是scott ,下面的語句將表emp 的SELECT權限授予用戶userl 和user2:

GRANT SELECT ON emp TO user1, user2;

如果要將某個對象權限授予所有用戶,可以用PUBLIC 代替所有的用戶名

用戶訪問其他用戶的對象時,需要用對方的用戶名限定對象
例如,用戶user1訪問emp表的語句為:

SELECT * FROM scott.emp;

如果沒有SELECT權限,用戶在查詢其他用戶的一個表時,將遇到“ORA-00942:表或視圖不存在”這樣的錯誤。
如果在為用戶指定某個對象權限時使用了“ WlTH GRANT OPTION ”選項,那麼這個用戶在接受了這個權限後,可以再將這個權限授予其他的用戶。
假設當前用戶是scott ,考察下面的權限操作語句:

GRANT SELECT ON emp TO user1 WITH GRANT OPTION;

conn user1/123

GRANT SELECT ON scott.emp TO user2;

conn user2/1234

SELECT * FROM scott.emp;

對於INSERT和UPDATE兩個對象權限,還可以進一步指定是在表中的哪個列上具有訪問權限,也就是說,可以規定其他用戶可以對表中的哪個列進行插入和修改操作。
例如,假設當前用戶是scott ,下面的語句將表emp 中對列empno的插入權限和sal 列的修改權限授予用戶user1和user2:

GRANT INSERT(empno), UPDATE(sal) ON emp TO user1, user2;

這樣用戶user1和user2就可以對表emp的列empno進行插入訪問,對sal 列進行修改訪問,而對其他列沒有任何訪問權限。
EXECUTE權限是指可以執行一個用戶所擁有的存儲函數、存儲過程和程序包的權限,假設當前用戶創建了-個存儲函數function1,通過下面的語句可以把對這個函數的執行權限授予用戶user1;

GRANT EXECUTE ON function1 TO user1;

REFERENCES權限是指其他用戶的表可以與當前用戶的表建立關聯關系的權限。

假設當前用戶有一個表,在這個表的某個列上建立了主鍵約束。
如果把這個表的REFERENCES 權限授予其他用戶,那麼其他用戶就可以通過外鍵將自己的表與這個表建立關聯關系,也就是可以引用這個表中的主鍵列的值。
假設當前用戶是scott ,在表dept的deptno列上建立了主鍵約束。

假設用戶scott要將表dept 上的deptno 列的REFERENCES 權限授予用戶user1,可以執行下面的GRANT語句:

GRANT REFERENCES(deptno) ON dept TO user1;

這樣用戶user1就可以創建一個表,在表上指定一個外鍵,並且與表dept上的deptno列建立關聯關系,或者修改一個已經存在的表,在表上指定一個外鍵,同樣可以建立這種關聯關系。

例如:

 CREATE TABLE test(deptno NUMBER REFERENCES scott.dept(deptno));

回收對象權限的命令是REVOKE 。

一般回收對象權限的操作由權限的授予者完成

這條命令的語法格式為:

REVOKE 對象權限列表 ON 對象名 FROM 用戶列表;

如果要回收與某個數據庫對象有關的所有對象權限,可以用ALL代替權限列表

例如,用戶scott要從用戶user1回收對表emp的所有權限,可以執行下面的REVOKE語句:

REVOKE ALL ON emp FROM user1;

如果要從所有用戶回收某個對象權限,可以用PUBLIC代替所有用戶的名稱
需要注意的是,權限INSERT 、UPDATE和REFERENCES在分配時可以指定相關的列,但是在回收時不能指定列,而只能指定表名。
例如,用戶scott要從用戶user2 回收對表emp 中sal 列上的UPDATE權限,下面的語句是錯誤的:

REVOKE UPDATE(deptno) ON dept FROM user2;

正確的寫法是:

REVOKE UPDATE ON dept FROM user2;

如果某個對象權限是以“WITH GRANT OPTION ”方式授予一個用戶的,那麼這個用戶可以將這個權限再授予其他用戶。
在從這個用戶回收對象權限時,也將同時從其他用戶回收,
這一點也是與系統權限不同的

例如,假設當前用戶scott將表emp 的SELECT權限以“ WITHGRANT OPTION ”方式授予了用戶user1, user1又將這個權限授予了用戶user2 ,那麼當用戶
scott從用戶userl 回收這個權限時,同時將這個權限從用戶user2 回收。

 

 

 

 

 

 



 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved