メッセージ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
にクエリを実行しています データベースに接続しようとしているユーザーアカウントを特定しようとしていますか?