sql >> データベース >  >> RDS >> Oracle

OCI_CONNECTにより、ORA-01438:この列で許可されている指定された精度よりも大きい値が発生する可能性がありますか?

    メッセージerror occurred at recursive SQL level 1 エラーがトリガー内で発生していることを私に示唆しています。私の推測では、AFTER LOGON ON SCHEMA またはDATABASE トリガーし、何らかの理由でWebサーバープロセスが接続しようとするとエラーが発生します。

    発生したエラーを生成する方法の例を次に示します。 TINYというテーブルがあります 、99までの値しかとることができない単一の列:

    SQL> desc tiny;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     N                                                  NUMBER(2)
    

    それでは、ユーザーアカウントを作成して、接続できることを確認しましょう。

    SQL> create user fred identified by fred account unlock;
    
    User created.
    
    SQL> grant connect to fred;
    
    Grant succeeded.
    
    SQL> connect fred/fred
    Connected.
    

    良い-私として再度ログインし、FREDの場合にエラーを引き起こすトリガーを作成しましょう 接続を試みます:

    SQL> connect luke/password
    Connected.
    SQL> create or replace trigger after_logon_error_if_fred
      2    after logon on database
      3  begin
      4    if user = 'FRED' then
      5      insert into tiny (n) values (100);
      6    end if;
      7  end;
      8  /
    
    Trigger created.
    

    TINY テーブルには99までの値しか格納できません。したがって、FREDの場合はどうなりますか 接続しようとしますか?

    SQL> connect fred/fred
    ERROR:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01438: value larger than specified precision allowed for this column
    ORA-06512: at line 3
    
    

    行番号とPHPが追加したビットを除けば、それはまさにあなたが受け取ったメッセージです。

    AFTER LOGONがあるかどうかを確認したい場合 データベースでトリガーを実行するには、クエリを実行してみてください

    SELECT trigger_name, owner FROM all_triggers
     WHERE TRIM(triggering_event) = 'LOGON';
    

    私のデータベース(Oracle 11g XEベータ版)では、次の出力が得られます:

    TRIGGER_NAME                   OWNER
    ------------------------------ ------------------------------
    AFTER_LOGON_ERROR_IF_FRED      LUKE
    

    Oracleがすぐにログを記録できるとは思わないので、PHPのoci_connectがあれば驚かれることでしょう。 どちらかを行います。

    bashスクリプトからPHPを実行した場合ではなく、Webサーバーでのみエラーが発生する理由についてのみ推測できます。おそらく、トリガーはV$SESSIONにクエリを実行しています データベースに接続しようとしているユーザーアカウントを特定しようとしていますか?




    1. 列名ENDのENDまたはその近くでの構文エラー

    2. Web2py –SQLiteからMySQLへの移行

    3. 既存のデータベースにSouthをインストールする際の問題。 MySqlは「スキーマ変更ステートメント」をサポートしていません

    4. SQL自己結合