A mensagem
error occurred at recursive SQL level 1
sugere-me que o erro está surgindo dentro de um gatilho. Meu palpite é que existe um AFTER LOGON ON SCHEMA
ou DATABASE
acionador e, por algum motivo, causa um erro quando o processo do servidor da Web tenta se conectar. Aqui está um exemplo de como gerar o erro que você está recebendo. Eu tenho uma tabela chamada
TINY
, com uma única coluna que só pode aceitar valores até 99:SQL> desc tiny; Name Null? Type ----------------------------------------- -------- ---------------------------- N NUMBER(2)
Agora vamos criar uma conta de usuário e verificar se eles podem se conectar:
SQL> create user fred identified by fred account unlock; User created. SQL> grant connect to fred; Grant succeeded. SQL> connect fred/fred Connected.
Bom - vamos fazer login novamente como eu e criar um gatilho que causará um erro se
FRED
tenta conectar: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.
Lembre-se de que nosso
TINY
tabela só pode armazenar valores até 99. Então, o que acontece quando FRED
tenta conectar? 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
Além do número da linha e do bit que o PHP adicionou, essa é exatamente a mensagem que você recebeu.
Se você quiser ver se há algum
AFTER LOGON
gatilhos em seu banco de dados, tente executar a consulta SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
No meu banco de dados (Oracle 11g XE beta), recebo a seguinte saída:
TRIGGER_NAME OWNER ------------------------------ ------------------------------ AFTER_LOGON_ERROR_IF_FRED LUKE
Eu não acredito que a Oracle faça qualquer log out-of-the-box, e eu ficaria surpreso se o
oci_connect
do PHP também. Só posso especular por que o erro surge apenas para o seu servidor web e não quando você executa o PHP a partir de um script bash. Talvez o gatilho esteja consultando
V$SESSION
e tentando descobrir qual conta de usuário está tentando se conectar ao banco de dados?