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 |
說實話,看起來你對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';
單引號是至關重要的。
本文國際來源:http://searchoracle.techtarget.com/
|
新聞熱點
疑難解答