sql >> Database >  >> RDS >> Oracle

Kan OCI_CONNECT een ORA-01438:waarde veroorzaken die groter is dan de opgegeven precisie die is toegestaan ​​voor deze kolom?

Het bericht error occurred at recursive SQL level 1 suggereert mij dat de fout zich voordoet binnen een trigger. Ik vermoed dat er een AFTER LOGON ON SCHEMA . is of DATABASE trigger, en om de een of andere reden veroorzaakt het een fout wanneer uw webserverproces verbinding probeert te maken.

Hier is een voorbeeld van hoe u de fout kunt genereren die u krijgt. Ik heb een tabel genaamd TINY , met een enkele kolom die alleen waarden tot 99 kan aannemen:

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

Laten we nu een gebruikersaccount maken en controleren of ze verbinding kunnen maken:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Goed - laten we opnieuw inloggen als ik en een trigger maken die een fout veroorzaakt als FRED probeert verbinding te maken:

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.

Bedenk dat onze TINY tabel kan alleen waarden tot 99 opslaan. Dus, wat gebeurt er als FRED probeert verbinding te maken?

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

Afgezien van het regelnummer en de bit die PHP heeft toegevoegd, is dat precies de boodschap die je kreeg.

Als u wilt zien of er AFTER LOGON triggers in uw database, probeer de query uit te voeren

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

Op mijn database (Oracle 11g XE beta) krijg ik de volgende output:

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

Ik geloof niet dat Oracle out-of-the-box logt, en het zou me verbazen als PHP's oci_connect doet ook niet.

Ik kan alleen maar speculeren waarom de fout zich alleen voordoet voor uw webserver en niet wanneer u PHP uitvoert vanuit een bash-script. Misschien zoekt de trigger V$SESSION en probeert u erachter te komen welk gebruikersaccount verbinding probeert te maken met de database?




  1. jquery ajax werkt niet zonder firebug-breekpunt

  2. Bouw een nieuwsbriefsysteem met PHP en MySQL

  3. .sql-bestand geeft de kolomkoppen in csv-bestand niet terug

  4. MySql:BESTELLEN DOOR ouder en kind