許多人剛剛接觸Oracle時,對于權限并不是很了解,如果有時候報錯ORA-1031缺少足夠的權限,且找不到所需要的授權的權限時,就會嘗試使用SYS來執行這個錯誤。由于SYS時整個數據庫的所有者,因此不會出現缺少權限的問題。
下面我們來介紹一個錯誤案例:在測試一個全文索引例子的時候,由于忘記切換用戶,使用了SYS用戶執行,結果出現ORA-1031錯誤,數據庫測試版本為9204:
SQL> SHOW USER
USER 為"SYS"
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(60));
表已創建。
SQL> INSERT INTO T VALUES (1, 'A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX');
已創建 1 行。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;
CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT
*
ERROR 位于第 1 行:
ORA-29855: 執行 ODCIINDEXCREATE 例行程序時出錯
ORA-20000: Oracle Text 錯誤:
DRG-50857: oracle error in drixtab.create_index_tables
ORA-01031: 權限不足
ORA-06512: 在"CTXSYS.DRUE", line 157
ORA-06512: 在"CTXSYS.TEXTINDEXMETHODS", line 204
注意:這個例子在普通用戶下并不會報錯:
SQL> CONN YANGTK/YANGTK@TEST1已連接。
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(60));
表已創建。
SQL> INSERT INTO T VALUES (1, 'A SIMPLE TEST FOR SYS CREATE CONTEXT INDEX');
已創建 1 行。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;
索引已創建。
通過EVENTS 10046進行跟蹤,發現在創建DR$IND_T_NAME$K表的時候報錯,而這個表是一個索引組織表。
根據這些信息查詢了METALINK,發現Bug No. 1366361對這個問題進行了比較清晰的闡述。缺少權限的不是SYS用戶,而是CTXSYS所建立的存儲過程沒有權限。不過此處并沒有解釋清楚為什么普通表沒有問題,而建立一個索引組織表報錯。
下面給出了對應的解決方法,將數據庫的O7_DICTIONARY_accessIBILITY設置為TRUE,重起后,就不會報錯了。
SQL> CONN /@TEST1 AS SYSDBA已連接。
SQL> SHOW PARAMETER O7
NAME TYPE VALUE
------------------------------------ ----------- --------------------------
O7_DICTIONARY_ACCESSIBILITY boolean FALSE
SQL> ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY = TRUE SCOPE = SPFILE;
系統已更改。
SQL> SHUTDOWN IMMEDIATE數據庫已經關閉。已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> STARTUP
ORACLE 例程已經啟動。
Total System Global Area 110173900 bytes
Fixed Size 454348 bytes
Variable Size 83886080 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes數據庫裝載完畢。數據庫已經打開。
最后刪除剛才建立索引失敗留下的垃圾表,就可以重建索引了:
SQL> DROP INDEX IND_T_NAME;
索引已丟棄。
SQL> CREATE INDEX IND_T_NAME ON T(NAME) INDEXTYPE IS CTXSYS.CONTEXT;
索引已創建。
新聞熱點
疑難解答