Oracle
 sql >> Database >  >> RDS >> Oracle

OCI_CONNECT può causare un ORA-01438:valore maggiore della precisione specificata consentita per questa colonna?

Il messaggio error occurred at recursive SQL level 1 mi suggerisce che l'errore si verifica all'interno di un trigger. La mia ipotesi è che ci sia un AFTER LOGON ON SCHEMA o DATABASE trigger e per qualche motivo provoca un errore quando il processo del server web tenta di connettersi.

Ecco un esempio di come generare l'errore che stai ricevendo. Ho una tabella chiamata TINY , con una singola colonna che può assumere solo valori fino a 99:

SQL> desc tiny;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 N                                                  NUMBER(2)

Ora creiamo un account utente e verifichiamo che possano connettersi:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Bene:accediamo nuovamente come me e creiamo un trigger che causerà un errore se FRED tentativi di connessione:

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.

Ricordiamo che il nostro TINY la tabella può memorizzare solo valori fino a 99. Quindi, cosa succede quando FRED tentativi di connessione?

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

A parte il numero di riga e il bit PHP aggiunto, questo è esattamente il messaggio che hai ricevuto.

Se vuoi vedere se ci sono AFTER LOGON trigger nel tuo database, prova a eseguire la query

SELECT trigger_name, owner FROM all_triggers
 WHERE TRIM(triggering_event) = 'LOGON';

Sul mio database (Oracle 11g XE beta), ottengo il seguente output:

TRIGGER_NAME                   OWNER
------------------------------ ------------------------------
AFTER_LOGON_ERROR_IF_FRED      LUKE

Non credo che Oracle esegua alcun log out-of-the-box e sarei sorpreso se oci_connect di PHP lo fa neanche.

Posso solo speculare sul motivo per cui l'errore si verifica solo per il tuo server web e non quando esegui PHP da uno script bash. Forse il trigger sta interrogando V$SESSION e stai cercando di capire quale account utente sta tentando di connettersi al database?