Oracle
 sql >> Base de données >  >> RDS >> Oracle

OCI_CONNECT peut-il provoquer un ORA-01438 :valeur supérieure à la précision spécifiée autorisée pour cette colonne ?

Le message error occurred at recursive SQL level 1 me suggère que l'erreur se produit dans un déclencheur. Je suppose qu'il y a un AFTER LOGON ON SCHEMA ou DATABASE déclencheur, et pour une raison quelconque, il provoque une erreur lorsque le processus de votre serveur Web tente de se connecter.

Voici un exemple de la façon de générer l'erreur que vous obtenez. J'ai une table appelée TINY , avec une seule colonne qui ne peut prendre que des valeurs jusqu'à 99 :

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

Créons maintenant un compte utilisateur et vérifions qu'il peut se connecter :

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Bien - reconnectons-nous en tant que moi et créons un déclencheur qui provoquera une erreur si FRED tentatives de connexion :

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.

Rappelons que notre TINY table ne peut stocker que des valeurs jusqu'à 99. Alors, que se passe-t-il lorsque FRED tente de se connecter ?

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

À part le numéro de ligne et le bit PHP ajouté, c'est exactement le message que vous avez reçu.

Si vous voulez voir s'il y a des AFTER LOGON déclencheurs dans votre base de données, essayez d'exécuter la requête

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

Sur ma base de données (Oracle 11g XE beta), j'obtiens le résultat suivant :

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

Je ne crois pas qu'Oracle fasse une journalisation prête à l'emploi, et je serais surpris si le oci_connect de PHP fait non plus.

Je ne peux que spéculer sur la raison pour laquelle l'erreur ne se produit que pour votre serveur Web et non lorsque vous exécutez PHP à partir d'un script bash. Peut-être que le déclencheur interroge V$SESSION et essayer de déterminer quel compte d'utilisateur essaie de se connecter à la base de données ?