Komunikat error occurred at recursive SQL level 1
sugeruje mi, że błąd pojawia się w spuście. Domyślam się, że istnieje AFTER LOGON ON SCHEMA
lub DATABASE
wyzwalacz i z jakiegoś powodu powoduje błąd, gdy proces serwera WWW próbuje się połączyć.
Oto przykład, jak wygenerować wyświetlany błąd. Mam tabelę o nazwie TINY
, z pojedynczą kolumną, która może przyjmować tylko wartości do 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Teraz utwórzmy konto użytkownika i sprawdźmy, czy mogą się połączyć:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Dobrze - zalogujmy się ponownie jako ja i utwórzmy wyzwalacz, który spowoduje błąd, jeśli FRED
próby połączenia:
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.
Przypomnij sobie, że nasz TINY
tabela może przechowywać tylko wartości do 99. A więc, co się dzieje, gdy FRED
próbuje się połączyć?
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
Poza numerem linii i dodanym bitem PHP, jest to dokładnie ta wiadomość, którą otrzymałeś.
Jeśli chcesz zobaczyć, czy są jakieś AFTER LOGON
wyzwalacze w Twojej bazie danych, spróbuj uruchomić zapytanie
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
W mojej bazie danych (Oracle 11g XE beta) otrzymuję następujące dane wyjściowe:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Nie wierzę, że Oracle robi jakiekolwiek logowanie po wyjęciu z pudełka i byłbym zaskoczony, gdyby oci_connect
PHP robi albo.
Mogę tylko spekulować, dlaczego błąd pojawia się tylko dla twojego serwera WWW, a nie podczas uruchamiania PHP ze skryptu bash. Być może wyzwalacz wysyła zapytanie do V$SESSION
i próbujesz dowiedzieć się, które konto użytkownika próbuje połączyć się z bazą danych?