Il messaggio error occurred at recursive SQL level 1
mi suggerisce che l'errore si verifica all'interno di un trigger. La mia ipotesi è che ci sia un AFTER LOGON ON SCHEMA
o DATABASE
trigger e per qualche motivo provoca un errore quando il processo del server web tenta di connettersi.
Ecco un esempio di come generare l'errore che stai ricevendo. Ho una tabella chiamata TINY
, con una singola colonna che può assumere solo valori fino a 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Ora creiamo un account utente e verifichiamo che possano connettersi:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Bene:accediamo nuovamente come me e creiamo un trigger che causerà un errore se FRED
tentativi di connessione:
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.
Ricordiamo che il nostro TINY
la tabella può memorizzare solo valori fino a 99. Quindi, cosa succede quando FRED
tentativi di connessione?
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
A parte il numero di riga e il bit PHP aggiunto, questo è esattamente il messaggio che hai ricevuto.
Se vuoi vedere se ci sono AFTER LOGON
trigger nel tuo database, prova a eseguire la query
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
Sul mio database (Oracle 11g XE beta), ottengo il seguente output:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Non credo che Oracle esegua alcun log out-of-the-box e sarei sorpreso se oci_connect
di PHP lo fa neanche.
Posso solo speculare sul motivo per cui l'errore si verifica solo per il tuo server web e non quando esegui PHP da uno script bash. Forse il trigger sta interrogando V$SESSION
e stai cercando di capire quale account utente sta tentando di connettersi al database?