Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kann OCI_CONNECT einen ORA-01438 verursachen:Wert größer als die angegebene Genauigkeit, die für diese Spalte zulässig ist?

Die Meldung error occurred at recursive SQL level 1 schlägt mir vor, dass der Fehler innerhalb eines Triggers auftritt. Meine Vermutung ist, dass es ein AFTER LOGON ON SCHEMA gibt oder DATABASE auslösen und aus irgendeinem Grund einen Fehler verursachen, wenn Ihr Webserverprozess versucht, eine Verbindung herzustellen.

Hier ist ein Beispiel dafür, wie Sie den Fehler generieren, den Sie erhalten. Ich habe eine Tabelle namens TINY , mit einer einzigen Spalte, die nur Werte bis 99 annehmen kann:

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

Lassen Sie uns jetzt ein Benutzerkonto erstellen und überprüfen, ob sie eine Verbindung herstellen können:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Gut - melden wir uns wieder als ich an und erstellen einen Trigger, der einen Fehler verursacht, wenn FRED Verbindungsversuche:

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.

Denken Sie daran, dass unser TINY Tabelle kann nur Werte bis 99 speichern. Was passiert also, wenn FRED Verbindungsversuche?

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

Abgesehen von der Zeilennummer und dem Bit, das PHP hinzugefügt hat, ist das genau die Nachricht, die Sie erhalten haben.

Wenn Sie sehen möchten, ob es AFTER LOGON gibt Trigger in Ihrer Datenbank, versuchen Sie, die Abfrage auszuführen

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

In meiner Datenbank (Oracle 11g XE Beta) erhalte ich die folgende Ausgabe:

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

Ich glaube nicht, dass Oracle sich standardmäßig protokolliert, und ich wäre überrascht, wenn PHPs oci_connect tut entweder.

Ich kann nur spekulieren, warum der Fehler nur für Ihren Webserver auftritt und nicht, wenn Sie PHP aus einem Bash-Skript ausführen. Vielleicht fragt der Trigger V$SESSION ab und versucht herauszufinden, welches Benutzerkonto versucht, sich mit der Datenbank zu verbinden?