Meddelandet error occurred at recursive SQL level 1
antyder för mig att felet uppstår inom en trigger. Min gissning är att det finns en AFTER LOGON ON SCHEMA
eller DATABASE
trigger, och av någon anledning orsakar det ett fel när din webbserverprocess försöker ansluta.
Här är ett exempel på hur du genererar felet du får. Jag har en tabell som heter TINY
, med en enda kolumn som bara kan ta värden upp till 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Låt oss nu skapa ett användarkonto och verifiera att de kan ansluta:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Bra - låt oss logga in igen som jag och skapa en utlösare som kommer att orsaka ett fel om FRED
försöker ansluta:
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.
Kom ihåg att vår TINY
Tabell kan bara lagra värden upp till 99. Så, vad händer när FRED
försöker ansluta?
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
Förutom radnumret och biten PHP som lagts till, är det precis det meddelande du fick.
Om du vill se om det finns några AFTER LOGON
utlösare i din databas, försök att köra frågan
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
På min databas (Oracle 11g XE beta) får jag följande utdata:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Jag tror inte att Oracle loggar direkt, och jag skulle bli förvånad om PHPs oci_connect
gör heller.
Jag kan bara spekulera i varför felet bara uppstår för din webbserver och inte när du kör PHP från ett bash-skript. Kanske utlösaren frågar V$SESSION
och försöker ta reda på vilket användarkonto som försöker ansluta till databasen?