ORA-00922 missing or invalid option
0RA-00922: 丟失或者無效的選項
Cause An invalid option was specifIEd in defining a column or storage clause. The valid option in specifying a column is NOT NULL to specify that the column cannot contain any NULL values. Only constraints may follow the datatype. Specifying a maximum length on a DATE or LONG datatype also causes this error.
Action Correct the syntax. Remove the erroneous option or length specification from the column or storage specification.
案例一:Oracle明文密碼漏洞
受影響系統:
Oracle Oracle10g Application Server 9.0.4.0
Oracle Oracle10g Application Server 10.1.0.2
描述:
Oracle Database是一款商業性質大型數據庫系統。
Oracle 10g存在包含明文密碼的全局可讀文件,本地攻擊者可以利用這個漏洞獲得對數據庫的訪問。
SYSMAN帳戶的密碼可在'$Oracle_HOME/hostname_sid/sysman/config/emoms.propertIEs'文件中獲得,此文件全局可讀。
另外如果安裝Oracle 10g時提供SYS, SYSTEM, DBSNMP和SYSMAN 帳戶密碼相同,並且密碼有驚歎號(如f00bar!!),那麼當設置SYSMAN和DBSNMP密碼時DB安裝會出現錯誤,錯誤信息"postDBCreation.log"會記錄密碼:
alter user SYSMAN identified by f00bar!! account unlock ERROR at line 1: ORA-00922: missing or invalid option alter user DBSNMP identifIEd by f00bar!! account unlock ERROR at line 1: ORA-00922: missing or invalid option
<*來源:David LitchfIEld ([email protected])
鏈接:http://marc.theaimsgroup.com/?l=bugtraq&m=110382247308064&w=2
*>
建議:
廠商補丁:
Oracle
ORACLE已經發布patch (#68)來修正此漏洞:http://metalink.Oracle.com/
案例二:置換變量
我才剛開始使用Oracle的產品,我在執行下面兩條命令的時候遇到了問題:ACCEPT 和PROMPT。我已經更改了行的順序,有時候放在CHAR中,有時候刪除,有時候放在PROMPT中,有時候刪除。無論我怎麼做還是收到錯誤信息。我甚至試過把ACCEPT 和PROMPT放在BEGIN的前後。
我想做的事情是這樣的。在腳本的開始,我從鍵盤讀取開始和結束日期,然後在程序的主要部分,我從一個表中使用SELECT讀取,並測試看日期是否在鍵盤輸入的兩個日期之間。現在當我在SQL*Plus中執行/編譯腳本的時候,我得到的錯誤信息是ORA-00922。
PROMPT ACCEPT in_beg_date PROMPT 'Enter beginning extract date mm/dd/yy ' PROMPT ACCEPT in_end_date PROMPT 'Enter ending extract date mm/dd/yy ' DECLARE beg_date VARCHAR2(8) := &in_beg_date; end_date VARCHAR2(8) := &in_end_date; beg_dte DATE; end_dte DATE; ... BEGIN beg_dte := TO_DATE (beg_date, 'MM/DD/YY'); end_dte := TO_DATE (end_date, 'MM/DD/YY'); ... IF (outrec_abs_date >= beg_dte and <= end_dte) THEN ...
說實話,看起來你對PROMPT 和 ACCEPT 有一個很好的理解。PROMPT 告訴SQL*Plus 在屏幕上書寫一行文字。你在這裡使用了兩個PROMPT命令;每個命令都在屏幕上打印一個空行,這對於垂直間距很有好處。ACCEPT命令是等待用戶輸入一個置換變量的值。ACCEPT命令中可選的PROMPT 子句在用戶輸入數值的同一行中顯示了一條信息。你在PL/SQL 塊的外面放置PROMPT 和 ACCEPT 是正確的:他們是SQL*Plus 命令,不是PL/SQL 。
你可能注意到當你運行這個腳本的時候,每一個擁有置換變量的行都引起了屏幕上的兩行輸出,例如:
old 3: beg_date VARCHAR2(8) := &in_beg_date; new 3: beg_date VARCHAR2(8) := 09/01/03;
這就顯示了SQL*Plus 在看到一行包括了置換變量的代碼的時候所作的工作:他用變量的數值(以&開頭)置換了變量的名字。這就像你在文本編輯器,例如記事本中,用查找和置換一樣,將一個字符串的每個出現(這裡是&in_beg_date)都替換成了另一個字符串(09/09/03)。“原來”的行就是在代碼中的樣子。“新”的行是將要執行的樣子。如果你執行了"beg_date VARCHAR2(8) := 09/01/03;"語句,會發生什麼?SQL*Plus 會創建一個字符串變量並且用":="右側的數值來進行初始化。在這個案例中,它是一個數字表達式,那麼SQL*Plus 就會檢測"(9/1) / 3"這個表達式,並將答案寫為'3'。你實際的意思是:
beg_date VARCHAR2(8) := '&in_beg_date'; end_date VARCHAR2(8) := '&in_end_date';
單引號是至關重要的。