Die Meldung error occurred at recursive SQL level 1
schlägt mir vor, dass der Fehler innerhalb eines Triggers auftritt. Meine Vermutung ist, dass es ein AFTER LOGON ON SCHEMA
gibt oder DATABASE
auslösen und aus irgendeinem Grund einen Fehler verursachen, wenn Ihr Webserverprozess versucht, eine Verbindung herzustellen.
Hier ist ein Beispiel dafür, wie Sie den Fehler generieren, den Sie erhalten. Ich habe eine Tabelle namens TINY
, mit einer einzigen Spalte, die nur Werte bis 99 annehmen kann:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Lassen Sie uns jetzt ein Benutzerkonto erstellen und überprüfen, ob sie eine Verbindung herstellen können:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Gut - melden wir uns wieder als ich an und erstellen einen Trigger, der einen Fehler verursacht, wenn FRED
Verbindungsversuche:
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.
Denken Sie daran, dass unser TINY
Tabelle kann nur Werte bis 99 speichern. Was passiert also, wenn FRED
Verbindungsversuche?
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
Abgesehen von der Zeilennummer und dem Bit, das PHP hinzugefügt hat, ist das genau die Nachricht, die Sie erhalten haben.
Wenn Sie sehen möchten, ob es AFTER LOGON
gibt Trigger in Ihrer Datenbank, versuchen Sie, die Abfrage auszuführen
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
In meiner Datenbank (Oracle 11g XE Beta) erhalte ich die folgende Ausgabe:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Ich glaube nicht, dass Oracle sich standardmäßig protokolliert, und ich wäre überrascht, wenn PHPs oci_connect
tut entweder.
Ich kann nur spekulieren, warum der Fehler nur für Ihren Webserver auftritt und nicht, wenn Sie PHP aus einem Bash-Skript ausführen. Vielleicht fragt der Trigger V$SESSION
ab und versucht herauszufinden, welches Benutzerkonto versucht, sich mit der Datenbank zu verbinden?