Meddelelsen error occurred at recursive SQL level 1
antyder for mig, at fejlen opstår inden for en trigger. Mit gæt er, at der er en AFTER LOGON ON SCHEMA
eller DATABASE
trigger, og af en eller anden grund forårsager det en fejl, når din webserverproces forsøger at oprette forbindelse.
Her er et eksempel på, hvordan du genererer den fejl, du får. Jeg har en tabel kaldet TINY
, med en enkelt kolonne, der kun kan tage værdier op til 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Lad os nu oprette en brugerkonto og bekræfte, at de kan oprette forbindelse:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Godt - lad os logge ind igen som mig og oprette en trigger, der vil forårsage en fejl, hvis FRED
forsøger at oprette forbindelse:
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.
Husk at vores TINY
tabel kan kun gemme værdier op til 99. Så hvad sker der, når FRED
forsøger at oprette forbindelse?
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
Bortset fra linjenummeret og biten PHP tilføjet, er det præcis den besked, du fik.
Hvis du vil se, om der er nogen AFTER LOGON
udløsere i din database, prøv at køre forespørgslen
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
På min database (Oracle 11g XE beta) får jeg følgende output:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Jeg tror ikke på, at Oracle logger ud af boksen, og jeg ville blive overrasket, hvis PHP's oci_connect
gør heller.
Jeg kan kun spekulere i, hvorfor fejlen kun opstår for din webserver og ikke når du kører PHP fra et bash-script. Måske udløseren forespørger V$SESSION
og prøver at finde ud af, hvilken brugerkonto der forsøger at oprette forbindelse til databasen?