Oracle錯誤案例:ORA-00922
2024-08-29 13:36:15
供稿:網友
 
             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 (david@nextgenss.com)
  
  鏈接: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';
  單引號是至關重要的。