11. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
當使用資料庫控制建立或編輯設定檔時,會要求當 PASSWORD_REUSE_MAX 或
PASSWORD_REUSE_TIME 其中一個設定值為數字時,另一個設定一定要為 UNLIMITED。不然將會出
現如下圖的錯誤訊息,然而這樣的要求才是真正的錯誤。因為若按照畫面要求的設定,其中一個為數字而
另一個則必須為 UNLIMITED,那麼使用這個設定檔的使用者將永遠不能使用之前用過的密碼。
--切換身份為SYS,因為要查詢資料辭典表格與視觀圖
SQL> CONNECT / AS SYSDBA
--建立一個測試帳號frank
SQL> GRANT CREATE SESSION TO frank IDENTIFIED BY oracle;
Grant succeeded.
--建立一個測試用設定檔prof_1,其中設定密碼重用限制次數為2次,重用時間無限制。
SQL> CREATE PROFILE prof_1 LIMIT
2 PASSWORD_REUSE_MAX 2
3 PASSWORD_REUSE_TIME UNLIMITED;
--將prof_1指派給frank
SQL> ALTER USER frank PROFILE prof_1;
SQL> ALTER USER frank IDENTIFIED BY abc123; --更改第一次
SQL> ALTER USER frank IDENTIFIED BY def456; --更改第二次
SQL> ALTER USER frank IDENTIFIED BY ghi789; --更改第三次
SQL>USER frank IDENTIFIED BY oracle; --此時已經更改過三次密碼,但卻還不能重用oracle這個密碼
ALTER USER frank IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-28007: the password cannot be reused
SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date
2 FROM sys.user_history$
3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK')
4 ORDER BY password_date;
PASSWORD PASSWORD_DATE
------------------------------ ---------------------------
8A52535A7428572D 2009-04-02 13:55:21 --此為oracle的雜湊值(Hash Value),尚未被移出
E209B58C9B4CAEF1 2009-04-02 15:10:49
A4D171F6D949760B 2009-04-02 15:11:03
3B52A820306F3F11 2009-04-02 15:11:15
--修改設定檔
SQL> ALTER PROFILE prof_1 LIMIT
2 PASSWORD_REUSE_MAX 2
3 PASSWORD_REUSE_TIME 5/1440; --設定用過的密碼保存5分鐘
SQL> ALTER USER frank IDENTIFIED BY oracle;
SQL> ALTER USER frank IDENTIFIED BY abc123;
SQL> ALTER USER frank IDENTIFIED BY def456;
SQL> SELECT password,TO_CHAR(password_date,'YYYY-MM-DD HH24:MI:SS') password_date
2 FROM sys.user_history$
3 WHERE user#=(SELECT user_id FROM dba_users WHERE username='FRANK')
4 ORDER BY password_date;
PASSWORD PASSWORD_DATE
12. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
------------------------------ ---------------------------------
8A52535A7428572D 2009-04-02 15:30:20 --此密碼將在2009-04-02 15:35:20後便可被移出
E209B58C9B4CAEF1 2009-04-02 15:30:29
A4D171F6D949760B 2009-04-02 15:31:34
SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual;
CURRENT_TIME
--------------------------------
2009-04-02 15:32:06
SQL> ALTER USER frank IDENTIFIED BY oracle; --因為oracle密碼尚未滿5分鐘
ALTER USER frank IDENTIFIED BY oracle
*
ERROR at line 1:
ORA-28007: the password cannot be reused
---等待約5分鐘後
SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') current_time FROM dual;
CURRENT_TIME
--------------------------------
2009-04-02 15:40:37
SQL> ALTER USER frank IDENTIFIED BY oracle; --更改密碼成功,表示可以重複使用oracle這個密碼
User altered.
所以如果想要使用者能夠重複舊密碼,則必須將 PASSWORD_REUSE_MAX 與
PASSWORD_REUSE_TIME 都設為數字。而且使用者想要重複使用舊密碼時,必須同時符合這兩個設定。
假設 PASSWORD_REUSE_MAX=5 且 PASSWORD_REUSE_TIME=10 時,則使用者只能夠使用 10
天以前且 5 次之前的舊密碼。
若兩者都為 UNLIMITED 則使用者可以無限制地重複使用舊密碼,不過這樣對資料庫安全有不良的影響。
PASSWORD_VERIFY_FUNCTION(複雜性函數)
此設定用來要求密碼必須符合某個函數(Function)的檢驗,只有通過檢驗的密碼才能被使用。Oracle 資料
庫允許資料庫管理者自己撰寫檢驗函數,只是此函數必須位於 SYS 綱要下,而且此函數必須接受三個輸
入參數(USERNAME VARCHAR2,PASSWORD VARCHAR2,OLD_PASSWORD VARCHAR2),與回傳
15. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
Connected.
SQL> CREATE USER green IDENTIFIED BY myboss;
CREATE USER green IDENTIFIED BY myboss
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20001: Password length less than 8
7.2.2 資源限制(Resource Limit)
設定檔除了可以對使用者的密碼進行限制外,還可用來限制階段作業所能消耗的一些資源。當階段作業所
消耗的資源量已經達到限制數量時,該階段作業將會被強制登出,以減少 Oracle 資料庫整體的資源消耗。
不過資源限制只有在資料庫資源已經不足的情況下,才有其必要。因此資料庫管理者可以透過
RESOURCE_LIMIT 參數啟動(TRUE)或關閉(FALSE)資源限制。若 RESOURCE_LIMIT 參數值為 FALSE,
即便設定檔中有對資源設定限制,也不會發生任何影響,直到資料庫管理者將 RESOURCE_LIMIT 參數
設為 TRUE 後,才會開始發生作用。
SQL> connect / as sysdba
Connected.
SQL> SELECT DISTINCT resource_name FROM dba_profiles
2 WHERE resource_type='KERNEL';
RESOURCE_NAME
---------------------------------------------
COMPOSITE_LIMIT
SESSIONS_PER_USER
CPU_PER_CALL
LOGICAL_READS_PER_SESSION
LOGICAL_READS_PER_CALL
PRIVATE_SGA
CPU_PER_SESSION
IDLE_TIME
CONNECT_TIME
9 rows selected.
--啟動資源限制設定
SQL> ALTER SYSTEM SET resource_limit=TRUE;
CPU/階段作業(CPU_PER_SESSION)
此設定用來限制每個階段作業所能消耗的 CPU 總時間(單位為 1/100 秒),一但超過此限制,正在進行中
的交易將被退回(Rollback),此階段作業也被強制登出。錯誤訊息為 ORA-02392: exceeded session
limit on CPU usage, you are being logged off。
SQL> connect / as sysdba
Connected.
--建立測試表格,通常不建議建立在SYSTEM綱要中,因為尚未建立其他的使用者。
SQL> CREATE TABLE system.big1 AS SELECT * FROM dba_objects;
SQL> COMMIT; --結束交易
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
16. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
68213
--交易開始
SQL> DELETE system.big1 WHERE object_id=2000;
1 row deleted.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212
SQL> DELETE system.big1;
DELETE big1
*
ERROR at line 1:
ORA-02392: exceeded session limit on CPU usage, you are being logged off
--超過CPU_PER_SESSION限制,這裡使用的值為CPU_PER_SESSION=5
SQL> SELECT COUNT(*) FROM system.big1;
SELECT COUNT(*) FROM system.big1
*
ERROR at line 1:
ORA-01012: not logged on --階段作業已經被強制登出,交易也被自動退回
Process ID: 30701
Session ID: 285 Serial number: 14071
SQL> CONNECT / AS SYSDBA --重新建立一個新階段作業
Connected.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
--------------
68213 --之前的交易的確已經被自動退回
CPU/呼叫(CPU_PER_CALL)
此設定用來限制每個 CPU 呼叫(解析-parse、執行-execute、回傳-fetch)不能消耗超過多少的 CPU 時間
(單位為 1/100 秒),一但超過限制,該 CPU 呼叫將會被取消,操作也會被退回。不過整個交易依然還在
持續中,階段作業也繼續存在不會被強制登出。錯誤訊息為 ORA-02393: exceeded call limit on CPU
usage。
SQL> connect / as sysdba
Connected.
SQL> COMMIT;
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68213
--交易開始
SQL> DELETE system.big1 WHERE object_id=2000;
17. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
1 row deleted.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212
SQL> DELETE system.big1;
delete big1
*
ERROR at line 1:
ORA-02393: exceeded call limit on CPU usage
--超過CPU_PER_CALL的限制,此設定為CPU_PER_CALL=5
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68212 --並沒有被退回,object_id=2000的資料列還是被刪除
--人為退回交易
SQL> ROLLBACK;
Rollback complete.
SQL> SELECT COUNT(*) FROM system.big1;
COUNT(*)
---------------
68213 --與交易前相同
18. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
連線時間(CONNECT_TIME)
此設定用來限制每個階段作業的總連線時間不能超過多少分鐘。若超過該階段作業將被強制登出,正在進
行的交易也會被自動退回。訊息如下:ORA-02399: exceeded maximum connect time, you are being
logged off
閒置時間(IDLE_TIME)
此設定用在限制每個階段作業不能連續超做多少分鐘沒有任何動作。若持續閒置時間超過限制,則此階段
作業將被強制登出,且交易自動退回。錯誤訊息如下:ORA-02396: exceeded maximum idle time,
please connect again
並行階段作業(SESSIONS_PER_USER)
此設定用來限制使用同一個資料庫帳戶所能建立的階段作業總數,若超過限制,新的階段作業將無法建立,
並會出現錯誤訊息 ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit。這個設定很適
合用在 3-Tier 或 C/S 架構的應用程式中,因為這種應用程式通常使用同一個資料庫帳戶建立多個階段作
業,資料庫管理者可以依照資料庫的負荷能力,藉由 SESSIONS_PER_USER 限制同時能夠登入資料庫
的階段作業數量。同時搭配 CONNECT_TIME 與 IDLE_TIME 將連線時間過長或閒置過久的階段作業終止,
這樣便可讓資料庫可以在最佳的負荷狀態下運行,而不會有過多的階段作業連入,造成整體資料庫的效能
下降。
讀取/階段作業(LOGICAL_READS_PER_SESSION)
此設定用在限制每個階段作業累計可以讀取的資料區塊數量不能超過多少,雖然名為
LOGICAL_READS_PER_SESSION,但是這裡的讀取是由實體讀取(Physical Read)與邏輯讀取(Logical
Read)組成。如果超過讀取總數量,則階段作業會出現錯誤訊息 ORA-02394: exceeded session limit
on IO usage, you are being logged off,正在進行中的交易將會被退回,階段作業也會被強制登出。
讀取/呼叫(LOGICAL_READS_PER_CALL)
此設定用在限制每個呼叫最多可以讀取的資料區塊,如果超過讀取總數量,則階段作業會出現錯誤訊息
ORA-02395: exceeded call limit on IO usage,正在進行中的 SQL 敘述句將會被退回,但交易不會有
影響,依然持續中,同時階段作業也繼續運行。
專用 SGA(PRIVATE_SGA)
當階段作業為共享伺服器(Shared Server)模式時,階段作業的使用者整體區域(User Global Area)將會放
在系統整體區域(System Global Area)中的大型集區(Large Pool)或共用集區(Shared Pool)。而 UGA 由
階段作業資訊(Session Information)、游標狀態(Cursor State)與 SQL 工作區域(SQL Work Area)等所
組成。資料庫管理者可以透過此設定限制每個階段作業的 UGA 不能超過 KB(KiloBytes),不過此設定僅
能在階段作業使用共用伺服器時才有效果。當階段作業所使用的 SGA 空間大小超過專用 SGA 的限制時,
將會出現錯誤訊息 ORA-02397: exceeded PRIVATE_SGA limit, you are being logged off,並被強制
登出。
複合限制(COMPOSITE_LIMIT)
此設定是將 CPU_PER_SESSION、LOGICAL_READS_PER_SESSION、CONNECT_TIME 與
PRIVATE_SGA,依 RESOURCE_COST 中所設定的成本,使用加權計算的方式得出複合限制值。因此
資料庫管理者可以自行依照目前資料庫最欠缺的資源,將其資源成本設定較其資源來的大,則便可以讓消
19. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
耗越多欠缺資源的階段作業,比其他階段作業更容易達到資源上限,而被強制離線。若超過此設定值,則
會出現錯誤訊息 ORA-02390: exceeded COMPOSITE_LIMIT, you are being logged off,同時進行中
的交易將會被退回,階段作業也會被強制登出。
SQL> connect / as sysdba
Connected.
SQL> SELECT * FROM resource_cost;
RESOURCE_NAME UNIT_COST
--------------------------------------------------- ----------------
CPU_PER_SESSION 0
LOGICAL_READS_PER_SESSION 0
CONNECT_TIME 0
PRIVATE_SGA 0
SQL> ALTER RESOURCE COST
2 CPU_PER_SESSION 10
3 CONNECT_TIME 1;
Resource cost altered.
SQL> SELECT * FROM resource_cost;
RESOURCE_NAME UNIT_COST
----------------------------------------------------- -----------------
CPU_PER_SESSION 10
LOGICAL_READS_PER_SESSION 0
CONNECT_TIME 1
PRIVATE_SGA 0
/*複合限制=CPU_PER_SESSION*10+LOGICAL_READS_PER_SESSION*0+CONNECT_TIME*1+PRIV
ATE_SGA*0 */
20. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
7.2.3 建立、修改、刪除設定檔(Create、Alter、Drop Profile)
建立設定檔使用 CREATE PROFILE 指令。資料庫管理者不需要將設定所有的參數,只要設定那些與
DEFAULT 設定檔不同的設定值即可,因為未設定的參數預設值為 DEFAULT(參考 DEFAULT 設定檔的
參數值)。
SQL> connect / as sysdba
Connected.
--建立一個測試使用者FRANK
SQL> CREATE USER frank IDENTIFIED BY oracle;
SQL> SELECT username,profile FROM dba_users WHERE username='FRANK';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK DEFAULT --因為沒有指定設定檔,所以Oracle資料庫自動指派DEAFULT設定檔
--建立一個設定檔TEST_PROF3
SQL> CREATE PROFILE test_prof3 LIMIT
2 PASSWORD_LIFE_TIME 100
3 PASSWORD_REUSE_MAX 5
4 PASSWORD_REUSE_TIME 10
5 CPU_PER_SESSION 1000
6 LOGICAL_READS_PER_SESSION 10000;
SQL> SELECT resource_name,limit FROM dba_profiles WHERE profile='TEST_PROF3';
22. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
PASSWORD_GRACE_TIME DEFAULT
刪除設定檔使用 DROP PROFILE 指令。如果被刪除的設定檔已經指派給某個使用者,則需要使用 DROP
PROFILE CASCADE。如果某個使用者所使用的設定檔被刪除後,則 Oracle 資料庫自動將 DEFAULT
設定檔指派給該使用者,所以每個使用者一定會被指派一個設定檔,同時 DEFAULT 設定檔不會被刪除。
SQL> connect / as sysdba
Connected.
SQL> SELECT DISTINCT profile FROM dba_profiles;
PROFILE
------------------------------
WKSYS_PROF
PROF_1
TEST_PROF3
TEST_PROF
DEFAULT
TEST_PROF2
SQL> DROP PROFILE "DEFAULT"; --DEFAULT設定檔不能被刪除
DROP PROFILE "DEFAULT"
*
ERROR at line 1:
ORA-02381: cannot drop PUBLIC_DEFAULT profile
SQL> DROP PROFILE test_prof2; --因為TEST_PROF2沒有指派給任何使用者
Profile dropped.
SQL> DROP PROFILE test_prof3; --因為TEST_PROF3至少指派給一個使用者,必須加上CASCADE
DROP PROFILE test_prof3
*
ERROR at line 1:
ORA-02382: profile TEST_PROF3 has users assigned, cannot drop without CASCADE
SQL> SELECT username,profile FROM dba_users WHERE profile='TEST_PROF3';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK TEST_PROF3
SQL> DROP PROFILE test_prof3 CASCADE;
Profile dropped.
--因為TEST_PROF3設定檔被刪除,所以Oracle資料庫將DEFAULT設定檔指派給FRANK
SQL> SELECT username,profile FROM dba_users WHERE username='FRANK';
USERNAME PROFILE
------------------------------ ------------------------------
FRANK DEFAULT
7.3 使用者(User)
建立一個資料庫使用者,需要一個重要的系統權限:CREATE USER。當擁有 CREATE USER 權限後,
任何人都可以建立資料庫使用者。所以不要隨便將 CREATE USE 權限授與給不需要的人,以免造成資料
23. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
庫的安全漏洞。當一個使用者被建立的同時,一個與使用者同名的綱要(Schema)也一起被建立。綱要與
使用者為兩個不同的物件,但是兩者有著密不可分的關係,即所有放在某綱要下的物件,便是與綱要相同
名字的使用者所擁有。同時只要是某個使用者所擁有的物件,一定會出現在同名的綱要內。所以綱要可以
視為一個邏輯的容器,裡面放著同名使用者擁有的所有物件。所以當執行 CREATE TABLE frank.T1 指
令時,frank 指的是 frank 綱要,而不是 frank 這個使用者。不過因為放在 frank 綱要下的物件,就是
frank 使用者所擁有的物件,所以有些人便將綱要與使用者混為一談,因此這裡要分清處它倆的差異。
7.3.1 建立新使用者(Create a New User)
當 Oracle 資料庫建立後,有許多的使用者帳戶會自動建立,例如:SYS、SYSTEM、SYSMAN、
DBSNMP 等。不過這些使用者是資料庫管理用的帳戶,並不是讓一般應用程式登入資料庫所使用。
其中最重要的一個使用者為 SYS。因為資料辭典的表格都放在 SYS 綱要中,同時從 Oracle Database9i
開始,SYS 必須以 AS SYSDBA 身份登入。否則為出現錯誤訊息,而無法登入。
當然還有一個重要使用者叫做 SYSTEM,因為 SYSTEM 被授與 DBA 角色,所以可以用來一般的資料庫
管理工作。除非 SYSTEM 使用者無法做到某些資料庫操作,例如開啟、關閉執行處理,建立資料庫或備
份、復原資料庫等工作,這時才會使用 SYS 帳號,不然一般使用 SYSTEM 帳號管理資料庫即可。
至於 SYSMAN 與 DBSNMP 這兩個使用者,只有當資料庫有設定資料庫控制(Database Control)時,才
會有這兩個使用者存在。
因此資料庫管理者必須建立一些使用者,讓前端應用程式可以使用這些帳戶登入資料庫。不過在建立資料
庫使用者之前,管理者要先回答下列問題,例如:使用者的預設表格空間與暫時表格空間為何?以及密碼
管理與資源限制的設定檔為何?,如此才能正確地設定使用者的相關參數。
預設表格空間(Default Tablespace)
當使用者建立一個新區段(Segment)時,若沒有指定該區段所使用的表格空間,則 Oracle 資料庫自動將
該區段建立在使用者的預設表格空間內。但是如果建立使用者時,連管理者也沒有設定預設表格空間參數,
則 Oracle 資料庫會使用資料庫的預設表格空間當作該使用者的預設表格空間。不過要注意,預設表格空
間只能使用表格空間的內容為永久型態的表格空間,不然將會出現錯誤訊息’ORA-12910: cannot
specify temporary tablespace as default tablespace’或’ORA-30033: Undo tablespace cannot
be specified as default user tablespace’。
同時當使用者想要建立某種區段時,必須擁有建立該種區段的權限(例如:建立表格需要 CREATE
TABLE 權限),以及對區段所在的表格空間還有足夠的配額。即便是使用者的預設表格空間也不能例外,
必須要有配額才能使用該表格空間的空間。
暫時表格空間(Temporary Tablespace)
當使用者的 SELECT 指令中包含 DISTINCT 子句、使用 GROUPING FUNCTION、GROUP BY 子句或
ORDER BY 等指令,或執行 CREATE INDEX 等 SQL 指令時,都需要進行一些排序(Sort)操作。此時如
24. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
果階段作業的 PGA 空間夠大,則可以在記憶體中進行排序稱作記憶體排序(Memory Sort)。然而可能因
為需要排序的資料過多或 PGA 空間不足,因此需要將資料先存放到暫時區段,然後才進行排序,此種方
式稱做磁碟排序(Disk Sort)。
所以建立使用者時,資料庫管理者可以設定使用者進行磁碟排序時,暫時區段所使用的暫時表格空間。若
管理者沒有指定,則 Oracle 資料庫自動將資料庫的預設暫時表格空間設定為使用者的暫時表格空間。不
過在指定暫時表格空間時,所使用的表格空間的內容必須是暫時型態,否則將會出現錯誤訊息’ORA-
12911: permanent tablespace cannot be temporary tablespace’。
SQL> connect / as sysdba
Connected.
SQL> SELECT property_name,property_value FROM database_properties
2 WHERE property_name LIKE '%TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------------ --------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMPTS1
DEFAULT_PERMANENT_TABLESPACE USERS
SQL> SELECT tablespace_name,contents FROM dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ -------------------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS UNDO
TEMPTS1 TEMPORARY
USERS PERMANENT
TEMPFRANK TEMPORARY
BIGTS_NEW PERMANENT
DEMOTS PERMANENT
TEMP TEMPORARY
/*只有CONTENTS為PERMANENT的表格空間可以當作預設表格空間。CONTENTS為TEMPORARY的表格
空間才能當作暫時表格空間。*/
SQL> SELECT DISTINCT profile FROM dba_profiles;
PROFILE
------------------------------
WKSYS_PROF
DEFAULT
TEST_PROF
/*建立使用者時,若未指定設定檔,則Oracle資料庫自動選擇Default設定檔,為此使用者的密碼與資源限制
設定檔。*/
建立使用者
建立資料庫使用者指令相當簡單,只要擁有 CREATE USER 的系統權限,便可以使用 CREATE USER 的
SQL 指令或資料庫控制(Database Control)建立一個資料庫使用者。
SQL> connect / as sysdba
Connected.
SQL> DROP USER frank CASCADE; --清除之前的測試使用者
25. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
密碼驗證
SQL> CREATE USER frank --不能與現存的使用者或角色相同名字
2 IDENTIFIED BY oracle --使用密碼驗證
3 DEFAULT TABLESPACE demots --當建立區段卻未指定所在表格空間時,將區段建立在此表格空間
4 TEMPORARY TABLESPACE temp --當需要暫時區段時,將暫時區段建立在此表格空間內
5 QUOTA 10M ON users --最多可以使用多少的空間,每個表格都要設定
6 QUOTA 10M ON demots
7 PASSWORD EXPIRE --讓密碼僅能使用在第一次登入時,之後立刻要求使用者更改密碼
8 ACCOUNT LOCK --當使用者被鎖定後,根本不能登入資料庫,直到解除鎖定為止
9 PROFILE TEST_PROF --密碼管理與資源使用限制受到此設定檔影響
10 ;
作業系統驗證
當欲使用作業系統驗證時,首先要確定兩件事:OS_AUTHENT_PREFIX 的值與作業系統使用者名字。因
為資料庫使用者名字必須為這兩個值結合後的結果,例如 OS_AUTHENT_PREFIX=ops$而作業系統使用
者為 frank,則資料庫使用者為 OPS$FRANK。不過如果 OS_AUTHENT_PREFIX 的參數值變更為 UUU
後,原來可以使用作業系統驗證登入的使用者便無法登入,因為所產生的資料庫使用者名字變為
UUUFRANK,這個使用者名字並不存在於資料庫中。
SQL> SHOW PARAMETER os_authent_prefix
NAME TYPE VALUE
------------------------------------------ ----------- ----------
os_authent_prefix string ops$
SQL> SELECT DISTINCT osuser FROM v$session; --找出目前所有階段作業在作業系統中所有的名字
OSUSER
------------------------------
oracle
SQL> CREATE USER ops$frank --frank為作業系統的使用者名字
2 IDENTIFIED EXTERNALLY; --外部驗證
--若作業系統為Windows平台系列
--SQLNET.ORA檔案中有SQLNET.AUTHENTICATION_SERVICE=(NTS),這是預設值
SQL> create user "OPS$FRANK11GADMINISTRATOR" identified externally;
/*作業系統使用者名字為Domain_nameUsername,如果沒有加入網域,網域名字以機器名稱代替。因為為
不是合法的命名字元,所以整個資料庫名字必須用雙引號包起來,同時資料庫使用者名字必須使用大寫英文字
母。
若想移除網域名字,需要將OSAUTH_PREFIX_DOMAIN=FALSE加到Windows Registry中*/
全域驗證
SQL> CREATE USER global_frank
2 IDENTIFIED GLOBALLY AS 'CN=frank,OU=Education,O=UUU,C=TW'; --全域驗證
使用者密碼
SQL> SELECT username,password,account_status
2 FROM dba_users
26. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
3 WHERE username LIKE '%FRANK%';
USERNAME PASSWORD ACCOUNT_STATUS
------------------------------ ----------------------------------- --------------------------------
OPS$FRANK EXTERNAL OPEN
FRANK EXPIRED & LOCKED
GLOBAL_FRANK GLOBAL OPEN
/*Oracle Database 11g後會安全起見,在此欄位上無法看到加密後的密碼字串。如果需要察看密碼字串,可
以由sys.user$.password得知。當ACCOUNT_STATUS為EXPIRED表示密碼已經失效,下一次登入資料庫
時會被要求更改密碼。若ACCOUNT_STATUS為LOCKED,則不能登入資料庫。*/
SQL> SELECT name,password FROM sys.user$ WHERE name='FRANK';
NAME PASSWORD
------------------------------ ------------------------------
FRANK 8A52535A7428572D --是由username+password本文,經雜湊運算後的密文
28. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
碼,否則將一直僵持在更改密碼畫面。 當密碼失效檢查通過後,接著 Oracle 資料庫檢查使用者是否擁有
CREATE SESSION 權限,若有 CREATE SESSION 權限則建立階段作業。
[oracle@ELinux ~]$ sqlplus frank/oracle
ERROR:
ORA-28001: the password has expired
Changing password for frank
New password: abc123
Retype new password: abc123
ERROR:
ORA-01045: user FRANK lacks CREATE SESSION privilege; logon denied --無法建立階段作業
Password changed --表示密碼已經改變為abc123。
/*但在Oracle11g之前的版本,都會出現password unchanged,但密碼已更改的情況。*/
配額(Quota)
配額用來限制使用者對每個表格空間的使用量,當配額超過或沒有設定配額時,使用者將無法增加對表格
空間的使用。這樣可以避免使用者意外地消耗過多表格空間的空間,也可以減少使用者將區段放置到錯誤
的表格空間中的機會。當建立使用者時,若沒有設定任何配額。則表示該使用者沒有任何的配額,也就是
29. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
說使用者不能使用任何表格空間的空間。資料庫管理者可以藉由 DBA_TS_QUOTAS 查知使用者空間配
額與表格空間的關係。
SQL> CONNECT / AS SYSDBA
Connected.
SQL> CREATE USER test_user1 IDENTIFIED BY oracle;
User created.
SQL> GRANT CREATE SESSION,CREATE TABLE TO test_user1;
Grant succeeded.
SQL> CONNECT test_user1/oracle; --切換身份為test_user1
SQL> CREATE TABLE t1 (a NUMBER) ;
CREATE TABLE t1 (a NUMBER)
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
/*這個錯誤訊息說明test_user1根本沒有設定任何配額在表格空間users上 */
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER USER test_user1 QUOTA 1M ON USERS; --給與test_user1有1M的配額在users表格空間中
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
TABLESPACE_NAME BYTES MAX_BYTES
------------------------------ ---------- ------------------
USERS 0 1048576
/*BYTES為已使用的空間。MAX_BYTES為配額上限,若為-1表示為無限制(UNLIMITED)*/
SQL> CREATE TABLE test_user1.t1 (a NUMBER) ;
/*因為表格放在test_user1綱要中,所以使用的空間配額為test_user1的配額。同時因為未指定表格空間,所
以使用test_user1的預設表格空間放此表格。*/
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
TABLESPACE_NAME BYTES MAX_BYTES
------------------------------ ---------- ------------------
USERS 65536 1048576
/*已用掉65536(64K)的空間配額*/
SQL> INSERT INTO test_user1.t1 VALUES(1);
30. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
SQL> COMMIT;
SQL> SELECT * FROM test_user1.t1;
A
-----------
1
當配額小於已使用空間時,只是表示此使用者不能再新增使用空間在此表格空間。而不會刪除任何已存在
表格或資料。
SQL> ALTER USER test_user1 QUOTA 0 ON users; --將表格空間users的配額設為0
SQL> SELECT tablespace_name,bytes,max_bytes FROM dba_ts_quotas
2 WHERE username='TEST_USER1';
no rows selected
SQL> CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users;
CREATE TABLE test_user1.t2(a NUMBER) TABLESPACE users
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
/*已使用的空間超過表格空間的配額,這個錯誤訊息與沒有設定配額是不同的錯誤訊息。*/
SQL> SELECT * FROM test_user1.t1; --已經存在的表格,不會因為配額因素而被刪除
A
-----------
1
7.2.2 修改使用者設定(Alter User)
當使用者建立後,除了使用者名字不能更改外,其餘的的設定都可以使用 ALTER USER 指令修改。
SQL> connect / as sysdba
Connected.
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
FRANK EXPIRED & LOCKED -- 帳戶被鎖定以及密碼失效
SQL> ALTER USER frank ACCOUNT UNLOCK; --解除帳戶鎖定
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
FRANK EXPIRED --密碼還是失效
SQL> ALTER USER frank IDENTIFIED BY oracle; --重新指派新密碼給frank
SQL> SELECT username,account_status FROM dba_users WHERE username='FRANK';
USERNAME ACCOUNT_STATUS
31. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
------------------------------ --------------------------------
FRANK OPEN --使用者可以登入且密碼有效
SQL> ALTER USER frank DEFAULT TABLESPACE users
2 QUOTA 20M ON users QUOTA 0 ON demots; --更改使用者對表格空間的配額設定
SQL> ALTER USER frank PROFILE default; --要求frank使用default設定檔
7.2.3 刪除使用者(Drop User)
當使用者暫時不需要登入資料庫時,只需將其鎖定即可。但是如果使用者已不再需要存在時,建議將它刪
除,以免留下一個資料庫安全的漏洞。根據是否有綱要物件存在,決定刪除使用者的語法。一但使用者被
刪除後,所有這個使用者擁有的物件都會一併被刪除,由於 DROP USER 為 DDL 指令,不能被退回
(Rollback),所以執行 DROP USER 指令時千萬要三思而後行。同時刪除使用者為資料庫中重要且危險的
工作,需要被授與 DROP USER 權限才可以執行 DROP USER 的操作。
SQL> connect / as sysdba
Connected.
SQL> DROP USER wilson; --因為WILSON綱要中沒有任何綱要物件存在。
User dropped.
SQL> DROP USER linda;
DROP USER linda
*
ERROR at line 1:
ORA-01922: CASCADE must be specified to drop 'LINDA'
/*因為LINDA綱要中有至少一個綱要物件存在。這是提供一個機會,讓管理者知道這個使用者的綱要中,還有
一些物件存在。可以再確認後,才繼續刪除使用者。*/
SQL> SELECT object_name,object_type FROM dba_objects WHERE owner='LINDA';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
T2 TABLE
T1 VIEW
/*發現LINDA擁有這兩個物件。*/
SQL> DROP USER LINDA CASCADE; --CASACDE參數會先將所有的綱要物件刪除後,才刪除使用者。
User dropped.
/*所有屬於LINDA的物件都隨著使用者刪除而一併被刪除。*/
SQL> DROP USER gigi; --如果GIGI已經建立至少一個階段作業時,Oracle資料庫無法刪除連線中的使用者
DROP USER gigi
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
32. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
7.2.4 代理使用者(Proxy User)
代理使用者允許使用者依自己的帳號與密碼登入資料庫,但建立階段作業後,使用者的身份卻變成另一個
使用者。這個功能早在 Oracle Database8i 時就已經存在,只是當時只能用在 OCI 呼叫所撰寫的程式中,
Oracle Database9i 再延伸到使用 JAVA 所撰寫的程式,直到 Oracle Database10g R2 後,才能用在
SQL*PLUS 的環境中。
SQL> connect / as sysdba
Connected.
SQL> CREATE USER app_user IDENTIFIED BY app_user;
User created.
SQL> GRANT CREATE SESSION TO app_user;
Grant succeeded.
SQL> CREATE USER client_user1 IDENTIFIED BY client_user1
2> QUOTA 10M ON users;
User created.
SQL> GRANT CREATE SESSION,CREATE TABLE TO client_user1;
Grant succeeded.
SQL> ALTER USER client_user1 GRANT CONNECT THROUGH app_user;
User altered.
SQL> CREATE TABLE client_user1.test_tab(a NUMBER);
Table created.
SQL> INSERT INTO client_user1.test_tab VALUES(1);
1 row created.
SQL> COMMIT;
Commit complete.
/*使用一般的方式登入*/
SQL> CONNECT app_user/app_user
Connected.
SQL> SHOW USER
USER is "APP_USER"
SQL> SELECT * FROM client_user1;
SELECT * FROM client_user1
*
ERROR at line 1:
ORA-00942: table or view does not exist
--使用代理使用者登入,以app_user的帳號與密碼登入,但登入後身份卻為client_user1
SQL> CONNECT app_user[client_user1]/app_user
Connected.
SQL> SHOW USER
33. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
USER is "CLIENT_USER1" --雖然以app_user身份登入,但使用者身份卻為client_user1
SQL> SELECT * FROM test_tab;
A
-----------
1
7.4 權限(Privilege)
在 Oracle 資料庫中,為了保護資料庫中的資料,Oracle 資料庫採用正面表列的方式,即藉由權限
(privilege)的授與,控制使用者所能執行的操作,如果沒有被授與權限或權限被收回,則無法進行相關的
操作。因此當一個新的使用者被建立後,預設是沒有任何權限,也就是一開始使用者無法做任何事,直到
被授與適當的權限為止。整個 Oracle 資料庫將所有的權限分為系統權限與物件權限兩種。
7.4.1 系統權限(System Privilege)
Oracle 資料庫的系統權限用來給予使用者可以對資料庫進行某些特殊管理操作,例如:建立使用者
(CREATE USER)、建立表格(CREATE TABLE)、查詢任何綱要中的表格(SELECT ANY TABLE)等動作。
系統權限的個數有隨著 Oracle 資料庫版本的增加而增多的趨勢,例如: 在 Oracl9i 時僅有 126 種系統權
限,而 Oracle10g 已增加到 166 種系統權限,但 Oracle11g 竟然有多達 206 種系統權限。
ANY SCHEMA
有時候資料庫管理者會看到兩個系統權限非常的相似,只差了一個字:ANY,例如 CREATE TABLE 與
CREATE ANY TABLE。有加上 ANY 與非有 ANY 的系統權限的差別,在於有 ANY 的系統權限範圍可
以跨越綱要。例如:被授與 CREATE TABLE 權限的使用者,可以建立表格在自己的綱要中。然而被授
與 CREATE ANY TABLE 的使用者,則可以建立表格在任何綱要中。至於 ANY 是否包含 SYS 綱要,則
根據參數 O7_DICTIONARY_ACCESSIBILITY 的值決定。若
34. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
O7_DICTIONARY_ACCESSIBILITY=FALSE,則 ANY 設定不包含 SYS 綱要。反之若為 TRUE,則
ANY 有包含 SYS 綱要。
不過為保護 SYS 綱要資料辭典(Data Dictionary)安全,自從 Oracle Database 9i 開始
O7_DICTIONARY_ACCESSIBILITY 預設值變為 FALSE。若有使用者因為工作需要,必須查詢資料辭
典內容,資料庫管理者可以透過授與 SELECT_CATALOG_ROLE 角色或授與 SELECT ANY
DICTIONARY 給該使用者,便可以讓使用者查詢資料辭典的內容。
SELECT ANY DICTIONARY 是 Oracle Database 9i 所新增的系統權限,可以讓使用者查詢所有的資料
辭典與資料辭典視觀圖。這種做法相對輕鬆,但是也隱含資安漏洞,因為是任何的資料辭典表格與視觀圖。
因為 SELECT_CATALOG_ROLE 是由物件權限所組成的,這些物件是資料辭典視觀圖(Data Dictionary
View),所以當使用者想要查詢的資料辭典或資料辭典視觀圖不在 SELECT_CATALOG_ROLE 的授權範
圍時,則無法查詢,此時需要額外的授權。這樣雖然比較麻煩,但是對整體資料庫安全而言是相對正確的
做法。
SQL> CONNECT / AS SYSDBA
SQL> SHOW PARAMETER O7_DICTIONARY_ACCESSIBILITY
NAME TYPE VALUE
------------------------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
SQL> GRANT CREATE SESSION TO gigi IDENTIFIED BY oracle; --建立測試使用者gigi
SQL> CONNECT gigi/oracle
Connected.
SQL> SHOW USER
USER is "GIGI"
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
/*Oracle 資料庫為增加安全性,當查詢某個表格或視觀圖時,不管是沒有查詢權限還是根本沒有該物件,錯
誤訊息都會出現為ORA-00942:表格或視觀圖不存在,以避免讓有不良企圖的使用者得知物件存在,只是沒
有權限而已。*/
SQL> CONNECT system/oracle
Connected.
SQL> GRANT SELECT ANY TABLE TO gigi;
/*SELECT ANY TABLE可以查詢任何綱要的表格或視觀圖。*/
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs; --SESSION_PRIVS可以查知目前可以使用那些系統權限
PRIVILEGE
----------------------------------------
35. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
CREATE SESSION
SELECT ANY TABLE
SQL> SELECT COUNT(*) FROM hr.employees; --需要安裝範例綱要
COUNT(*)
---------------
107
SQL> SELECT COUNT(*) FROM sh.sales; --需要安裝範例綱要
COUNT(*)
---------------
918843
SQL> SELECT COUNT(*) FROM dba_tables;
SELECT COUNT(*) FROM dba_tables
*
ERROR at line 1:
ORA-00942: table or view does not exist
/* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法
查詢到資料辭典視觀圖。*/
SQL> SELECT COUNT(*) FROM sys.tab$;
SELECT COUNT(*) FROM sys.tab$
*
ERROR at line 1:
ORA-00942: table or view does not exist
/* O7_DICTIONARY_ACCESSIBILTY=FALSE時,ANY不包含SYS綱要,所以SELECT ANY TABLE無法
查詢到資料辭典表格。*/
SQL> CONNECT / AS SYSDBA
Connected.
SQL> GRANT SELECT ANY DICTIONARY TO gigi;
Grant succeeded.
SQL> REVOKE SELECT ANY TABLE FROM gigi;
Revoke succeeded.
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SELECT ANY DICTIONARY
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT COUNT(*) FROM dba_tables;
36. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
COUNT(*)
---------------
2522
SQL> SELECT COUNT(*) FROM sys.tab$;
COUNT(*)
---------------
2587
SQL> CONNECT system/oracle
Connected.
SQL> REVOKE SELECT ANY DICTIONARY FROM gigi;
Revoke succeeded.
SQL> GRANT SELECT_CATALOG_ROLE TO gigi;
Grant succeeded.
SQL> CONNECT gigi/oracle
Connected.
SQL> SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
CONNECT
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE
SQL> SELECT COUNT(*) FROM hr.employees;
SELECT COUNT(*) FROM hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> SELECT COUNT(*) FROM dba_tables;
COUNT(*)
---------------
2522
SQL> SELECT COUNT(*) FROM sys.tab$;
SELECT COUNT(*) FROM sys.tab$
*
ERROR at line 1:
ORA-00942: table or view does not exist
由以上的範例得知,SELECT ANY TABLE 無法查詢資料辭典表格或資料辭典視觀圖,但可以查詢除
SYS 綱要外的所有表格與視觀圖。而 SELECT ANY DICTIONARY 可以用來查詢資料辭典表格或資料辭
37. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
典視觀圖,但卻無法用來非 SYS 綱要外的表格或視觀圖上。因此資料庫管理者在授與 SELECT ANY
TABLE 與 SELECT ANY DICTIONARY 時,要依據使用者的需求授與其適當的權限即可。
7.4.2 物件權限(Object Privilege)
物件權限是給予使用者對某個綱要物件進行某種操作的權限,物件權限依不同的物件型態有不同的物件權
限。例如:表格物件有 ALTER、DELETE、INDEX、INSERT、SELECT、UPDATE、REFERENCES、
ON COMMIT REFRESH、QUERY REWRITE、DEBUG、FLASHBACK 等 11 種權限,而函數
(Function)物件或程序(Procedure)物件則有 EXECUTE 與 DEBUG 兩種。在 Oracle Database 11g 時,
共有 26 種不同型態的物件權限。
7.4.3 授與權限(Grant Privilege)
使用 GRANT 指令,可以權限授與使用者、角色或 PUBLIC。PUBLIC 是一種特殊的角色,代表著資料庫
的所有人。一但權限授與給 PUBLIC 時,所有資料庫的使用者都可以得到此權限,可以簡化授權的操作,
但是卻帶來資料庫安全的風險,一般不建議使用這種方式。
SQL> CONNECT / AS SYSDBA
SQL> GRANT CREATE SESSION to scott IDENTIFIED BY tiger; --建立一個測試使用者scott
SQL> GRANT CREATE SESSION to green IDENTIFIED BY oracle;
--授與系統權限
SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank,scott;
/*同時將SELECT ANY TABLE,CREATE TABLE系統權限授與frank與scott兩人,這兩人僅能使用SELECT
ANY TABLE與CREATE TABLE權限,但不能授與或收回該權限。*/
38. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
SQL> GRANT SELECT ANY TABLE,CREATE TABLE TO frank WITH ADMIN OPTION;
/*除了將SELECT ANY TABLE,CREATE TABLE權限授與frank外,並且讓frank擁有管理SELECT ANY TA
BLE與CREATE TABLE的權力,因此frank可以將SELECT ANY TABLE或CREATE TABLE授與任何人或角
色,而且也可以由任何人或角色身上收回這兩個系統權限。*/
--授與物件權限
SQL> CREATE TABLE frank.big1 AS SELECT * FROM DBA_OBJECTS; --建立範例表格
SQL> GRANT SELECT ON frank.big1 TO scott;
/*授與frank綱要中表格big1上的SELECT權限給scott,但是scott僅能使用該權限,但不能將權限授與給他
人。*/
SQL> GRANT SELECT ON frank.big1 TO scott WITH GRANT OPTION;
/*scott除了自己被授與frank綱要的big1表格上的SELECT 權限外,還可以將該權限授權給其他人。*/
SQL> CONNECT scott/tiger --切換身份為scott
SQL> GRANT SELECT ON frank.big1 TO green; --scott將frank.big1的SELECT權限授與green
7.4.4 收回權限(Revoke Privilege)
權限既然可以被授與,當然也可以被收回。不過當收回權限時,依系統權限與物件權限有不同的方法。首
先收回系統權限時,使用者必須擁有該系統權限的 ADMIN OPTION,才能收回該系統權限。可以由
DBA_SYS_PRIVS 中查知系統權限授權給哪些人或哪些角色。
SQL> CONNECT / AS SYSDBA
SQL> SELECT grantee,admin_option FROM dba_sys_privs
2 WHERE privilege='SELECT ANY TABLE';
GRANTEE ADM
------------------------------------------------------ -------
DBA YES
MDSYS NO
SYS YES
IMP_FULL_DATABASE NO
WKSYS NO
EXP_FULL_DATABASE NO
DATAPUMP_IMP_FULL_DATABASE NO
OLAP_DBA NO
FLOWS_030000 NO
SYSTEM NO
OLAPSYS NO
FRANK YES
SQL> REVOKE SELECT ANY TABLE FROM frank; --將SELECT ANY TABLE由frank身上收回
Revoke succeeded.
SQL> SELECT grantee,admin_option FROM dba_sys_privs
2 WHERE privilege='SELECT ANY TABLE';
GRANTEE ADM
------------------------------------------------------ -------
DBA YES
MDSYS NO
SYS YES
IMP_FULL_DATABASE NO
WKSYS NO
EXP_FULL_DATABASE NO
39. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
DATAPUMP_IMP_FULL_DATABASE NO
OLAP_DBA NO
FLOWS_030000 NO
SYSTEM NO
OLAPSYS NO
/* frank不在擁有SELECT ANY TABLE權限*/
重疊收回(CASCADE REVOKE)
當物件權限被收回時,有一種系統權限沒有的特色:重疊收回。即收回某使用者被授與的物件權限時,所
有由該使用者所授權出去的物件權限都會被一起收回,而系統權限則須一個個的收回。不過如果欲收回的
物件權限不是由收回者所直接授與,則無法收回該物件權限。可以由
DBA_TAB_PRIVS/ALL_TAB_PRIVS/USER_TAB_PRIVS 查知物件權限的階層關係。
SQL> CONNECT / AS SYSDBA
--查詢哪些人被授與frank.big1表格的SELECT權限
SQL> SELECT grantee,grantor,grantable FROM dba_tab_privs
2 WHERE owner='FRANK' AND table_name='BIG1';
GRANTEE GRANTOR GRA
------------------------------ ----------------------------------- -------
SCOTT FRANK YES
GREEN SCOTT NO
/*可以得知FRANK授權給SCOTT,而SCOTT再將權限授權給GREEN。關係為FRANK->SCOTT->GREEN*/
SQL> CONNECT frank/oracle --身份切換為frank
Connected.
SQL> SHOW USER
USER is "FRANK"
SQL> REVOKE SELECT ON frank.big1 FROM green;
REVOKE SELECT ON frank.big1 FROM green
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant
/*green的權限來自於scott,只能由scott收回green的權限。或者藉由CASCADE REVOKE機制,收回scott
的權限時,會先將green的權限收回。*/
SQL> SELECT grantee,grantor,grantable FROM user_tab_privs
2 WHERE table_name='BIG1';
GRANTEE GRANTOR GRA
------------------------------ ----------------------------------- -------
SCOTT FRANK YES
GREEN SCOTT NO
SQL> REVOKE SELECT ON big1 FROM scott;
Revoke succeeded.
SQL> SELECT grantee,grantor,grantable FROM user_tab_privs
2 WHERE table_name='BIG1';
no rows selected
/*不僅是scott的物件權限被收回,同時由scott所授權出去的物件權限也一併被收回,這就是重疊收回(CASC
ADE REVOKE)。不過只有在收回物件權限時,才會有此現象,收回系統權限必須一個一個慢慢收回。*/
41. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
因為角色為完成某些工作所需的權限集合,所以當建立角色時,通常以工作職稱或應用程式為角色名字。
SQL> CREATE ROLE test_role_a; --建立一個不需要驗證即可啟用的角色
SQL> CREATE ROLE test_role_b --建立一個需要驗證才能啟用的角色
2 IDENTIFIED BY oracle; --建立一個區域角色(Local Role),角色啟用透過密碼進行驗證。
/*IDENTIFIED EXTERNALLY 建立一個外部角色(External Role),角色啟用透過作業系統進行驗證。*/
/*IDENTIFIED GLOALLY 建立一個全域角色(Global Role),角色啟用透過目錄服務(Directory Service)進行
驗證。*/
/*IDENTIFIED USING package_name 建立一個應用程式角色(Application Role),角色啟用透過套件(Pack
age)進行驗證。*/
SQL> CREATE ROLE test_role_c;
SQL> SELECT * FROM dba_roles WHERE role LIKE 'TEST_ROLE_%';
ROLE PASSWORD
------------------------------ ------------------
TEST_ROLE_A NO
TEST_ROLE_B YES
TEST_ROLE_C NO
--將權限授權給角色,權限可以為物件或系統權限
SQL> GRANT CREATE PROCEDURE,CREATE ANY TABLE TO test_role_a;
SQL> GRANT SELECT ANY TABLE TO test_role_b;
SQL> GRANT CREATE MATERIALIZED VIEW TO test_role_c;
SQL> GRANT SELECT ON frank.big1 TO test_role_c;
--可以由ROLE_SYS_PRIVS查知每個角色被授與的系統權限
SQL> SELECT role,privilege,admin_option FROM role_sys_privs
2 WHERE role LIKE 'TEST_ROLE_%';
ROLE PRIVILEGE ADM
------------------------------ ---------------------------------------------- -------
TEST_ROLE_C CREATE MATERIALIZED VIEW NO
TEST_ROLE_A CREATE ANY TABLE NO
TEST_ROLE_A CREATE PROCEDURE NO
TEST_ROLE_B SELECT ANY TABLE NO
--可以由ROLE_TAB_PRIVS得到角色被授與的物件權限
SQL> SELECT role,owner,table_name,privilege,grantable
2 FROM role_tab_privs
3 WHERE role LIKE 'TEST_ROLE_%';
ROLE OWNER TABLE_NAME PRIVILEGE GRA
-------------------- --------------------- ---------------------------------- ----------------------- --------
TEST_ROLE_C FRANK BIG1 SELECT NO
--將角色授權給使用者
SQL> GRANT test_role_a,test_role_b TO frank;
SQL> GRANT test_role_c TO frank WITH ADMIN OPTION;
/*將frank不僅能使用test_role_c所帶來的權限,也可將test_role_c角色授權給其他使用者或角色,或由其他
角色或使用者處收回test_role_c角色。*/
--透過DBA_ROLE_PRIVS可以得到角色授權給哪些使用者、角色,以及是否有ADMIN OPTION
SQL> SELECT * FROM dba_role_privs
2 WHERE granted_role LIKE 'TEST_ROLE_%';
42. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ ------- -------
FRANK TEST_ROLE_B NO YES
SYS TEST_ROLE_C YES YES --因為TEST_ROLE_C為SYS所建立
FRANK TEST_ROLE_C YES YES --ADM=YES表示有ADMIN OPTION
SYS TEST_ROLE_B YES YES
FRANK TEST_ROLE_A NO YES
SYS TEST_ROLE_A YES YES
修改角色(Alter Role)
當角色建立後,資料庫管理者只能更改驗證的方法,其實也沒有其他設定可以修改。
SQL> ALTER ROLE test_role_a IDENTIFIED BY oracle;
SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A';
ROLE PASSWORD
------------------------------ -----------------
TEST_ROLE_A YES
SQL> ALTER ROLE test_role_a NOT IDENTIFIED;
SQL> SELECT * FROM dba_roles WHERE role='TEST_ROLE_A';
ROLE PASSWORD
------------------------------ -----------------
TEST_ROLE_A NO
刪除角色(Drop Role)
當角色被刪除時,Oracle 資料庫自動將角色由被授權的使用者與角色處收回,然後才刪除角色。如果角
色被刪除時,已經被使用者啟用,則已啟用的角色所帶來的權限不受影響,可以繼續使用那些權限。
SQL> DROP ROLE test_role;
7.5.2 預設角色(Default Role)
預設角色為當使用者登入資料庫後,會自動生效的角色。通常將角色授權給使用者時,這個角色便成為預
設角色。可是有時候使用者被授與角色,是因為備援的關係,例如副主管也會被授與主管的權限,因為當
主管不在辦公室時,則副主管必須能夠代行主管權責。可是平常主管在辦公室時,副主管則不能也不該使
用主管權限。所以資料庫管理者可以建立一個主管角色並加上密碼驗證,然後將主管角色授與副主管,但
是不要讓主管角色為副主管的預設角色。因此平常副主管登入資料庫時,僅擁有自己的角色與權限,一但
當主管離開辦公室時,副主管便可以利用密碼將主管角色生效,便可以代理主管的工作,卻不會同時有兩
個人同時握有主管權限造成雙頭馬車的問題。
資料庫管理者可以由 DBA_ROLE_PRIVS 來得到使用者所被授與的角色及預設角色為何。
SQL> CONNECT / AS SYSDBA
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B YES
TEST_ROLE_C YES
TEST_ROLE_A YES
43. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
--使用frank身份登入
[oracle@ELinux ~]$ sqlplus frank/oracle
SQL> SHOW USER
USER is "FRANK"
SQL> SELECT * FROM session_roles; --此階段作業目前啟用的角色
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_B
TEST_ROLE_C
/*因為test_role_a,test_role_b,test_role_c都是預設角色,所以即使test_role_b需要驗證才能啟用,但是
預設角色不在此限,因為預設角色為登入後自動啟用,不須另外啟用。*/
SQL> SELECT * FROM session_privs; --此階段作業目前可以使用的系統權限
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE ANY TABLE
SELECT ANY TABLE
CREATE PROCEDURE
CREATE MATERIALIZED VIEW
SELECT ANY DICTIONARY
7 rows selected.
SQL> exit; --結束此階段作業
修改使用者的預設角色
資料庫管理者可以事後修改使用者的預設角色,這個操作不會將角色收回,只是設定那些角色在階段作業
建立時,不會自動啟用,需要額外使用 SET ROLE 啟用角色。
SQL> SHOW USER
USER is "SYS"
SQL> ALTER USER frank DEFAULT ROLE NONE; --將所有的被授與角色都變成不是預設角色
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B NO
TEST_ROLE_C NO
TEST_ROLE_A NO
SQL> ALTER USER frank DEFAULT ROLE test_role_b,test_role_c;
/*將test_role_b與test_role_c設定為預設角色,其餘被授與的角色為非預設角色。*/
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ -------
TEST_ROLE_B YES
TEST_ROLE_C YES
44. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
TEST_ROLE_A NO
SQL> ALTER USER frank DEFAULT ROLE ALL; --將所有被授與的角色都設定為預設角色
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ ------
TEST_ROLE_B YES
TEST_ROLE_C YES
TEST_ROLE_A YES
SQL> ALTER USER frank DEFAULT ROLE ALL EXCEPT test_role_b,test_role_c;
/*除了test_role_b與test_role_c外,其餘被授與的角色都設為預設角色。*/
SQL> SELECT granted_role,default_role FROM dba_role_privs
2 WHERE grantee='FRANK';
GRANTED_ROLE DEF
------------------------------ ------
TEST_ROLE_B NO
TEST_ROLE_C NO
TEST_ROLE_A YES
7.5.3 啟用角色(Set Role)
當階段作業建立後,Oracle 資料庫會自動啟用使用者的預設角色。使用者可以自行查詢
SESSION_ROLES 得知目前階段作業中已啟用的角色,也可以透過 SESSION_PRIVS 知道可以使用那些
系統權限。然而不是預設角色的啟用,則需要使用 SET ROLE 指令。可是 SET ROLE 指令也可以將某些
角色關閉,因為 SET ROLE 用來設定目前階段作業欲啟用的角色。若一個已啟用的角色,沒有被後續的
SET ROLE 指令指明,則 Oracle 資料庫會將該角色關閉。
[oracle@ELinux ~]$ sqlplus frank/oracle
SQL> SHOW USER
USER is "FRANK"
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A --只有test_role_a為預設角色
SQL> SET ROLE test_role_c; --將啟用test_role_c,其他角色必須關閉
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_C --只有test_role_c角色被啟用,test_role_b角色反而被關閉
SQL> SET ROLE ALL; --因為test_role_b需要驗證,不能使用ALL
SET ROLE ALL
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'TEST_ROLE_B'
45. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
SQL> SET ROLE test_role_a,test_role_b IDENTIFIED BY oracle,test_role_c;
/*要求啟用test_role_a,test_role_b,test_role_c這幾個角色*/
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_B
TEST_ROLE_C
SQL> SET ROLE NONE; --關閉所有角色
SQL> SELECT * FROM session_roles;
no rows selected
SQL> SET ROLE ALL EXCEPT test_role_b; --啟用所有被授與的角色,除了test_role_b
SQL> SELECT * FROM session_roles;
ROLE
------------------------------
TEST_ROLE_A
TEST_ROLE_C
SQL> SET ROLE dba; --只能啟用已經被授與的角色
SET ROLE dba
*
ERROR at line 1:
ORA-01924: role 'DBA' not granted or does not exist
46. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
7.5.4 事先定義的角色(Predefined Role)
所謂事先定義的角色,是指那些在建立資料庫的同時,Oracle 資料庫預先建立與授與權限的角色,主要
是為了減輕資料庫管理者的負擔,不需要建立角色與授與權限給角色即可立刻使用。Oracle Database
11g 中的預設角色有:AQ_ADMINISTRATOR_ROLE、AQ_USER_ROLE、CONNECT、DBA、
DELETE_CATALOG_ROLE、EXECUTE_CATALOG_ROLE、EXP_FULL_DATABASE、
HS_ADMIN_ROLE、IMP_FULL_DATABASE、RECOVERY_CATALOG_OWNER、RESOURCE、
SCHEDULER_ADMIN、SELECT_CATALOG_ROLE、XDBADMIN、XDB_SET_INVOKER、
XDB_WEBSERVICES 、 XDB_WEBSERVICES_OVER_HTTP 、 XDB_WEBSERVICES_WITH_PUBLIC 。
這些角色中以 CONNECT 與 RESOURCE 最為人所熟知。許多資料庫管理者建立使用者後,通常都會立
刻授予 CONNECT 角色給使用者,這樣使用者使用如建立階段作業(CREATE SESSION)、建立表格
(CREATE TABLE)等基本權限。若此使用者是程式設計人員,那麼 DBA 就會將 RESOURCE 角色也授予
使用者,讓其擁有一些開發資料庫程式所需要的權限。事實上有許多 DBA 根本不知道他自己到底給予了
使用者那些權限,只是依循以前的步驟。也不知道這些角色中,其實隱藏著一些安全漏洞。
CONNECT
如同之前所言,角色是為了簡化權限的管理。所以當 DBA 授予某個角色給使用者時,當然必須先了解這
個角色,到底是由那些權限所組成的。DBA 可以查詢下列的視觀圖(VIEW)來得到這些資訊。通常是查詢
ROLE_SYS_PRIVS(系統權限授與給那些角色)或 DBA_SYS_PRIVS(系統權限授與給那些角色或使用者):
SQL> CONNECT system/oracle --此處使用system身份即可
SQL> show user
USER 為 "SYSTEM"
SQL> DESC role_sys_privs
Name Null? Type
----------------------------------------- ----------------------- ----------------------------------------
ROLE NOT NULL VARCHAR2(30)
PRIVILEGE NOT NULL VARCHAR2(40)
ADMIN_OPTION VARCHAR2(3)
SQL> DESC dba_sys_privs
Name Null? Type
----------------------------------------- ----------------------- ----------------------------------------
PRIVILEGE NOT NULL VARCHAR2(40)
ADMIN_OPTION VARCHAR2(3)
不過有一個需要注意的地方,那就是查詢 ROLE_SYS_PRIVS 中,無法找到 CONNECT 或 RESOURCE
兩個角色的資訊,必須查詢 DBA_SYS_PRIVS 才可以得到有關的資訊。
/*在Oracle Database 10g之前的版本*/
SQL> select privilege from role_sys_privs where role='CONNECT';
沒有任何資料列被選取
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE SYNONYM
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
47. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
SQL> select privilege from role_sys_privs where role='RESOURCE';
沒有任何資料列被選取
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TYPE
CREATE TABLE
CREATE CLUSTER
CREATE TRIGGER
CREATE OPERATOR
CREATE SEQUENCE
CREATE INDEXTYPE
CREATE PROCEDURE
已選取 8 個資料列.
/*以上結果在Oracle Database 9i資料庫方為如此*/
所以當使用者被授予 CONNECT 角色後,他便擁有 CREATE VIEW,CREATE TABLE,ALTER
SESSION,CREATE CLUSTER,CREATE SESSION,CREATE SYNONYMN,CREATE
SEQUENCE,CREATE DATABASE LINK 等權限,這也就是為何要授予 CONNECT 角色給一般使用者
的原因,可以簡化權限管理的複雜度。
但是在 Oracle Database 10g R2 之後,CONNECT 角色所內含的權限僅剩下 CREATE SESSION 一個,
其餘的權限都不再被預設授予給 CONNECT 角色。所以如果 DBA 還是因循過去的方法建立使用者,那麼
這個使用者只能建立連線但無法進行其他的動作,若 DBA 不能深究授予 CONNECT 角色的原因,一但出
現權限不足的問題,就無法很快地解決問題。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> create user frank identified by oracle;
已建立使用者.
SQL> grant connect to frank;
順利授權.
SQL> connect frank/oracle
已連線.
SQL> show user
USER 為 "FRANK"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
為了解決 Oracle Database 10g R2 後 CONNECT 角色的內容更動,DBA 可以利用下列兩種方式來解決
所遇到的問題:
DBA 另外建立一個新的角色,將其餘的權限(CREATE VIEW,CREATE TABLE,ALTER
SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE SEQUENCE,CREATE DATABASE
48. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
LINK)授予給新建的角色,之後找到有那些使用者或角色已經被授予 CONNECT 角色,最後將新建的角
色授予給那些使用者即可。
SQL> show user
USER 為 "SYSTEM"
SQL> create role new_connect;
SQL> grant create table,create view,create cluster,create synonym,create sequence,create database li
nk,
alter session to new_connect;
順利授權.
SQL> select grantee from dba_role_privs where granted_role='CONNECT';
GRANTEE
------------------------------
WMSYS
IX
PM
OLAP_USER
MDDATA
FRANK
SYS
EXFSYS
MDSYS
SCOTT
已選取 10 個資料列.
SQL> grant new_connect to frank;
順利授權.
SQL> connect frank/oracle
已連線.
SQL> show user
USER 為 "FRANK"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
NEW_CONNECT
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
ALTER SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
執行%ORACLE_HOME%rdbmsadminrstrconn.sql(Windows 平台)或
$ORACLE_HOME/rdbms/admin/rstrconn.sql(UNIX 平台),將 CREATE VIEW,CREATE
TABLE,ALTER SESSION,CREATE CLUSTER, CREATE SYNONYMN,CREATE
SEQUENCE,CREATE DATABASE LINK 再授予給 CONNECT 角色,使 CONNECT 角色的內容恢復到
Oracle Database10gR2 之前的樣子。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
49. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL>@$ORACLE_HOME/rdbms/admin/rstrconn.sql
順利授權
確認完成
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE VIEW
CREATE TABLE
ALTER SESSION
CREATE CLUSTER
CREATE SESSION
CREATE SYNONYM
CREATE SEQUENCE
CREATE DATABASE LINK
已選取 8 個資料列.
RESOURCE
由之前的資訊可以得知,RESOURCE 角色擁有 CREATE TYPE,CREATE TABLE,CREATE
CLUSTER,CREATE TRIGGER,CREATE OPERATOR,CREATE SEQUENCE,CREATE
INDEXTYPE,CREATE PROCEDURE 這些權限,所以被授予這個角色的使用者,就間接擁有這些權限。
這些權限大多數是當進行資料庫程式開發時,建立一些資料庫物件所必須的權限,所以一般的 DBA 通常
會直接授予 RESOURCE 角色給程式設計人員,讓他們可以順利地進行開發工作。但是在建立資料庫物件
之前,使出者必須先要建立資料庫連線,也就是同時必須擁有 CREATE SESSION 的權限。也就是如此,
就形成文章前面所形容的情形,當 DBA 建立一個新的使用者時,便會順便授予 CONNECT 與
RESOURCE 兩個角色給使用者,讓使用者可以順利地進行他的工作。不過在 Oracle 資料庫中,建立
SEGMENT(即需要空間放資料的物件,如 TABLE,CLUSTER,INDEX 等等)物件時,除了要建立相關物件
的權限外,還要擁有該物件放所放置的表格空間(TABLESPACE)上的空間配額(QUOTA)未超過。而空間
配額的設定可以在建立使用者的同時或之後再更改配額,不過重要是,空間配額預設是沒有,所以沒有設
定就沒有配額。
SQL> show user
USER 為 "SYSTEM"
SQL> create user testuser1 identified by oracle;
已建立使用者.
SQL> grant create table to testuser1;
順利授權.
SQL> connect testuser/oracle
ERROR:
ORA-01045: user TESTUSER lacks CREATE SESSION privilege; logon denied
警告: 您已不再與 ORACLE 相連
SQL> connect system/oracle
已連線.
SQL> show user
USER 為 "SYSTEM"
SQL> grant create session to testuser1;
順利授權.
SQL> connect testuser/oracle
已連線.
SQL> show user
USER 為 "TESTUSER1"
SQL> select * from session_roles;
50. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
沒有任何資料列被選取
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
SQL> create table test1 (a number) tablespace users;
create table test1 (a number) tablespace users
*
ERROR 在行 1:
ORA-01950: 沒有表格空間 'USERS' 的權限
SQL> connect system/oracle
已連線.
SQL> alter user testuser1 quota 10M on users;
已更改使用者.
SQL> connect testuser1/oracle@o10gr2
已連線.
SQL> show user
USER 為 "TESTUSER1"
SQL> create table test1 (a number) tablespace users;
已建立表格.
當授予 RESOURCE 角色給使用者時,有個相信是絕大多數的 DBA 都不知道的安全漏洞,那就是使用者
可以不需任何表格空間的配額,只要有建立物件的權限,即可在任何的表格空間上建立物件。這是因為當
授予 RESOURCE 角色時,Oracle 資料庫會順便授與 UNLIMITED TABLESPACE 給使用者,擁有此權
限的使用者不需要配額即可將物件建立在任何的表格空間上。除了失去原本設計配額這項屬性的意義外,
同時有可能造成整個資料庫中,物件胡亂放置的問題,影響資料庫的管理與安全。
SQL> show user
USER 為 "SYSTEM"
SQL> create user testuser2 identified by oracle;
已建立使用者.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
沒有任何資料列被選取
SQL> grant connect,resource to testuser2;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE
SQL> select privilege from dba_sys_privs where grantee='CONNECT';
PRIVILEGE
----------------------------------------
CREATE SESSION
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TRIGGER
CREATE SEQUENCE
CREATE TYPE
CREATE PROCEDURE
CREATE CLUSTER
CREATE OPERATOR
CREATE INDEXTYPE
CREATE TABLE
已選取 8 個資料列.
SQL> connect testuser2/oracle@o10gr2;
51. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
已連線.
SQL> show user
USER 為 "TESTUSER2"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已選取 10 個資料列.
如何解決這個 Well Known Bug(內行人都知道)?
• 直接將”UNLIMITED TABLESPACE”收回即可。
SQL> show user
USER 為 "SYSTEM"
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
PRIVILEGE
----------------------------------------
UNLIMITED TABLESPACE
SQL> revoke unlimited tablespace from testuser2;
順利撤銷.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER2';
沒有任何資料列被選取
SQL> connect testuser2/oracle@o10gr2
已連線.
SQL> show user
USER 為 "TESTUSER2"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
52. Chapter 7 User And Privilege
Oracle Database 11g 資料庫管理入門
已選取 9 個資料列.
• 新建一個角色,取代 RESOURCE 原本的功能 。
SQL> show user
USER 為 "SYSTEM"
SQL> create role new_resource;
已建立角色.
SQL> select privilege from dba_sys_privs where grantee='RESOURCE';
PRIVILEGE
----------------------------------------
CREATE TRIGGER
CREATE SEQUENCE
CREATE TYPE
CREATE PROCEDURE
CREATE CLUSTER
CREATE OPERATOR
CREATE INDEXTYPE
CREATE TABLE
已選取 8 個資料列.
SQL> grant create trigger,create sequence,create type,create procedure,create cl
uster,create operator,create indextype,create table to new_resource;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='NEW_RESOURCE';
PRIVILEGE
----------------------------------------
CREATE OPERATOR
CREATE TRIGGER
CREATE CLUSTER
CREATE TABLE
CREATE PROCEDURE
CREATE INDEXTYPE
CREATE SEQUENCE
CREATE TYPE
已選取 8 個資料列.
SQL> create user testuser3 identified by oracle;
已建立使用者.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER3';
沒有任何資料列被選取
SQL> grant connect,new_resource to testuser3;
順利授權.
SQL> select privilege from dba_sys_privs where grantee='TESTUSER3';
沒有任何資料列被選取
SQL> connect testuser3/oracle@o10gr2;
已連線.
SQL> show user
USER 為 "TESTUSER3"
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
NEW_RESOURCE
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER