Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O OCI_CONNECT pode causar um ORA-01438:valor maior que a precisão especificada permitida para esta coluna?


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?