最近在作數據治理的過程當中,回收了部分帳號的權限,由於角色RESOURCE裏擁有CREATE TABLE的權限,因此我想回收RESOURCE角色。例如,對於TEST帳號,收回其建立表的權限,就收回了授予其的RESOURCE的角色,結果不到幾小時,SUPPORT人員就反饋這個帳號遇到了ORA-01536錯誤。開始還有點懵,後面梳理清楚後,才感慨本身踩了一個大坑。下面簡單的從新構造、模擬這樣的一個案例。數據庫
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.5.0 - 64bit Production
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
SQL>CREATE TABLESPACE TBS_TEST_DATA
DATAFILE '/u03/oradata/gps/tbs_test_data.dbf'
SIZE 200M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO ONLINE;
SQL> CREATE USER TEST IDENTIFIED BY "Test#1232134$#3" DEFAULT TABLESPACE TBS_TEST_DATA TEMPORARY TABLESPACE TEMP;
User created.
SQL> GRANT CONNECT, RESOURCE TO TEST;
Grant succeeded.
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='TEST';
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
TEST UNLIMITED TABLESPACE NO
SQL> SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='TEST';
GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
TEST RESOURCE NO YES
TEST CONNECT NO YES
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='RESOURCE';
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
RESOURCE CREATE TRIGGER NO
RESOURCE CREATE SEQUENCE NO
RESOURCE CREATE TYPE NO
RESOURCE CREATE PROCEDURE NO
RESOURCE CREATE CLUSTER NO
RESOURCE CREATE OPERATOR NO
RESOURCE CREATE INDEXTYPE NO
RESOURCE CREATE TABLE NO
8 rows selected.
用帳號TEST登陸數據庫,建立了一個test表app
SQL> show user;
USER is "TEST"
SQL> create table test
2 as
3 select * from all_objects;
Table created.
SQL> select count(*) from test;
COUNT(*)
----------
34859
SQL>
而後收回帳號TEST的RESOURCE角色,以下所示:ide
SQL> show user;
USER is "SYS"
SQL> REVOKE RESOURCE FROM TEST;
Revoke succeeded.
SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='TEST';
no rows selected
而後此時TEST作DML操做就會報ORA-01536錯誤,以下ui
SQL> show user;
USER is "TEST"
SQL> insert into test
2 select * from test;
insert into test
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'TBS_TEST_DATA'
那麼爲何出現這種狀況呢? 其實剛開始我也有點懵,檢查表空間發現表空間正常,檢查RESOURCE角色,發現裏面沒有關於表空間的配額限制。怎麼回收RESOURCE角色,就整出這麼一檔子事呢?那麼究竟是怎麼一回事呢,直到我看到Doc ID 465737.1才豁然開朗。this
其實細心的人應該也有所發現(上面截圖),若是您授予或撤銷用戶的 RESOURCE 或 DBA 角色,ORACLE會隱式授予或撤銷該用戶的 UNLIMITED TABLESPACE 系統權限。Doc ID 465737.1中介紹,其實當角色在Oracle 7.0 中首次引入時,RESOURCE 和 DBA 的權限從舊的Oracle V6中遷移到新的角色中。 可是因爲不容許爲 RESOURCE 和 DBA 角色授予 UNLIMITED TABLESPACE權限,爲了保持與Oracle V6版本的向後兼容性,解析器會自動將語句轉換爲「grant resource to abc」自動變爲「grant resource,unlimited tablespace to abc」 而且將「revoke resource from abc」自動變爲「revoke resource, unlimited tablespace from abc」。 授予和撤銷 DBA 角色時也是如此。 也就是說UNLIMITED TABLESPACE的系統權限已經被硬編碼到RESOURCE角色。而咱們建立用戶時,沒有額外授予用戶關於表空間使用配額。因此一旦系統權限UNLIMITED TABLESPACE被收回,就出現問題了。編碼
解決這個問題也比較簡單,設置帳號使用表空間的配額限制或不限制用戶使用表空間,以下所示spa
GRANT UNLIMITED TABLESPACE TO TEST;
或
ALTER USER TEST QUOTA UNLIMITED ON TBS_TEST_DATA;
ORA-01536 After Revoking DBA Role (Doc ID 465737.1)code |
In this Documentblog
APPLIES TO: Oracle Database - Enterprise Edition - Version 8.1.7.4 to 11.2.0.4 [Release 8.1.7 to 11.2]
SQL> conn /as sysdba This issue has been discussed in bug 6494010.
To Resolve this issue you need to : BUG:6494010 - ORA-01536 AFTER GRANTING,REVOKING ROLE DBA |
參考資料:
ORA-01536 After Revoking DBA Role (Doc ID 465737.1)