メッセージerror occurred at recursive SQL level 1
は、エラーがトリガー内で発生していることを示しています。私の推測では、AFTER LOGON ON SCHEMA
またはDATABASE
トリガーがあり、何らかの理由で、Webサーバープロセスが接続しようとしたときにエラーが発生します。
発生しているエラーを生成する方法の例を次に示します。TINY
99までの値しか受け取れない単一の列を持つ、というテーブルがあります。
SQL> desc tiny;
名前ヌル?タイプ
-------------------------------------------------- ---------------------------
N番号(2)
次に、ユーザーアカウントを作成して、接続できることを確認しましょう。
SQL>fredアカウントのロック解除によって識別されるユーザーfredを作成します。
ユーザーが作成しました。
SQL>fredへの接続を許可します。
グラントは成功しました。
SQL> fred/fredに接続
接続されています。
良い-私としてログインし直して、FRED
接続しようとするとエラーが発生するトリガーを作成しましょう。
SQL>接続ルーク/パスワード
接続されています。
SQL>トリガーafter_logon_error_if_fredを作成または置換
2データベースにログオンした後
3開始
4ユーザー='FRED'の場合
5小さな(n)値(100)に挿入します。
6終了する場合;
7終了;
8/
トリガーが作成されました。
TINY
テーブルには99までの値しか格納できないことを思い出してください。では、FRED
接続しようとするとどうなりますか?
SQL> fred/fredに接続
エラー:
ORA-00604:再帰SQLレベル1でエラーが発生しました
ORA-01438:この列に許可されている指定された精度よりも大きい値
ORA-06512: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
ます。
エラーがWebサーバーでのみ発生し、bashスクリプトからPHPを実行した場合には発生しない理由についてのみ推測できます。おそらく、トリガーはクエリV$SESSION
を実行して、どのユーザーアカウントがデータベースに接続しようとしているのかを把握しようとしているのでしょうか。