Съобщението error occurred at recursive SQL level 1
ми подсказва, че грешката възниква в рамките на тригер. Предполагам, че има AFTER LOGON ON SCHEMA
или DATABASE
задейства и по някаква причина причинява грешка, когато процесът на вашия уеб сървър се опита да се свърже.
Ето пример за това как да генерирате грешката, която получавате. Имам таблица, наречена TINY
, с една колона, която може да приема само стойности до 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Сега нека създадем потребителски акаунт и да проверим дали могат да се свържат:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Добре – нека влезем отново като мен и да създадем тригер, който ще предизвика грешка, ако FRED
опити за свързване:
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.
Спомнете си, че нашият TINY
може да съхранява само стойности до 99. И така, какво се случва, когато FRED
опити за свързване?
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
Освен номера на реда и добавения PHP бит, това е точно съобщението, което получавате.
Ако искате да видите дали има някакви AFTER LOGON
задейства във вашата база данни, опитайте да изпълните заявката
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
В моята база данни (Oracle 11g XE бета) получавам следния резултат:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Не вярвам, че Oracle извършва някакво логване извън кутията и бих се изненадал, ако oci_connect
на PHP прави едно от двете.
Мога само да предполагам защо грешката възниква само за вашия уеб сървър, а не когато стартирате PHP от bash скрипт. Може би тригерът прави заявка V$SESSION
и се опитвате да разберете кой потребителски акаунт се опитва да се свърже с базата данни?