sql >> Databasteknik >  >> RDS >> Oracle

Kan OCI_CONNECT orsaka ett ORA-01438:-värde som är större än den specificerade precisionen som tillåts för denna kolumn?

Meddelandet error occurred at recursive SQL level 1 antyder för mig att felet uppstår inom en trigger. Min gissning är att det finns en AFTER LOGON ON SCHEMA eller DATABASE trigger, och av någon anledning orsakar det ett fel när din webbserverprocess försöker ansluta.

Här är ett exempel på hur du genererar felet du får. Jag har en tabell som heter TINY , med en enda kolumn som bara kan ta värden upp till 99:

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

Låt oss nu skapa ett användarkonto och verifiera att de kan ansluta:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Bra - låt oss logga in igen som jag och skapa en utlösare som kommer att orsaka ett fel om FRED försöker ansluta:

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.

Kom ihåg att vår TINY Tabell kan bara lagra värden upp till 99. Så, vad händer när FRED försöker ansluta?

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

Förutom radnumret och biten PHP som lagts till, är det precis det meddelande du fick.

Om du vill se om det finns några AFTER LOGON utlösare i din databas, försök att köra frågan

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

På min databas (Oracle 11g XE beta) får jag följande utdata:

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

Jag tror inte att Oracle loggar direkt, och jag skulle bli förvånad om PHPs oci_connect gör heller.

Jag kan bara spekulera i varför felet bara uppstår för din webbserver och inte när du kör PHP från ett bash-skript. Kanske utlösaren frågar V$SESSION och försöker ta reda på vilket användarkonto som försöker ansluta till databasen?




  1. php ersätt array-id-nycklar

  2. Ebean letar efter fel sekvensnamn i Play Framework 2

  3. MySQL kommandorad och transaktioner

  4. Hur man kontrollerar ett datum för ett datumintervall ligger mellan två datum i mysql-frågan