Zpráva error occurred at recursive SQL level 1
naznačuje mi, že chyba vzniká v rámci spouštěče. Můj odhad je, že existuje AFTER LOGON ON SCHEMA
nebo DATABASE
a z nějakého důvodu způsobí chybu, když se proces vašeho webového serveru pokusí připojit.
Zde je příklad, jak vygenerovat chybu, která se vám zobrazuje. Mám tabulku s názvem TINY
, s jedním sloupcem, který může nabývat pouze hodnot do 99:
SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Nyní vytvoříme uživatelský účet a ověříme, že se mohou připojit:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Dobře – přihlaste se jako já a vytvořte spouštěč, který způsobí chybu, pokud FRED
pokusy o připojení:
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.
Připomeňme, že naše TINY
tabulka může ukládat pouze hodnoty do 99. Co se tedy stane, když FRED
pokusy o připojení?
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
Kromě čísla řádku a přidaného bitu PHP to je přesně ta zpráva, kterou jste dostali.
Pokud chcete zjistit, zda existují nějaké AFTER LOGON
triggery ve vaší databázi, zkuste spustit dotaz
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
V mé databázi (Oracle 11g XE beta) dostávám následující výstup:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Nevěřím, že Oracle provádí nějaké přihlašování přímo z krabice, a byl bych překvapen, kdyby PHP oci_connect
dělá buď.
Mohu pouze spekulovat o tom, proč k chybě dochází pouze pro váš webový server a ne, když spouštíte PHP z bash skriptu. Možná se spouštěč dotazuje na V$SESSION
a snažíte se zjistit, jaký uživatelský účet se pokouší připojit k databázi?