sql >> Base de Datos >  >> RDS >> Oracle

¿Puede OCI_CONNECT causar un ORA-01438:valor mayor que la precisión especificada permitida para esta columna?

El mensaje error occurred at recursive SQL level 1 me sugiere que el error surge dentro de un disparador. Supongo que hay un AFTER LOGON ON SCHEMA o DATABASE desencadenar, y por alguna razón provoca un error cuando el proceso de su servidor web intenta conectarse.

Aquí hay un ejemplo de cómo generar el error que está recibiendo. Tengo una tabla llamada TINY , con una sola columna que solo puede tomar valores hasta 99:

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

Ahora vamos a crear una cuenta de usuario y verificar que se puedan conectar:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Bien:volvamos a iniciar sesión como yo y creemos un disparador que cause un error si FRED intentos de conexión:

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.

Recuerda que nuestro TINY la tabla solo puede almacenar valores hasta 99. Entonces, ¿qué sucede cuando FRED intenta conectarse?

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

Aparte del número de línea y el bit PHP agregado, ese es exactamente el mensaje que recibiste.

Si desea ver si hay alguna AFTER LOGON disparadores en su base de datos, intente ejecutar la consulta

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

En mi base de datos (Oracle 11g XE beta), obtengo el siguiente resultado:

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

No creo que Oracle realice ningún registro listo para usar, y me sorprendería si oci_connect de PHP tampoco lo hace.

Solo puedo especular sobre por qué el error surge solo para su servidor web y no cuando ejecuta PHP desde un script bash. Quizás el activador está consultando V$SESSION y tratando de averiguar qué cuenta de usuario está tratando de conectarse a la base de datos?