sql >> Database teknologi >  >> RDS >> Oracle

Kan OCI_CONNECT forårsage en ORA-01438:-værdi, der er større end den specificerede præcision tilladt for denne kolonne?

Meddelelsen error occurred at recursive SQL level 1 antyder for mig, at fejlen opstår inden for en trigger. Mit gæt er, at der er en AFTER LOGON ON SCHEMA eller DATABASE trigger, og af en eller anden grund forårsager det en fejl, når din webserverproces forsøger at oprette forbindelse.

Her er et eksempel på, hvordan du genererer den fejl, du får. Jeg har en tabel kaldet TINY , med en enkelt kolonne, der kun kan tage værdier op til 99:

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

Lad os nu oprette en brugerkonto og bekræfte, at de kan oprette forbindelse:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Godt - lad os logge ind igen som mig og oprette en trigger, der vil forårsage en fejl, hvis FRED forsøger at oprette forbindelse:

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.

Husk at vores TINY tabel kan kun gemme værdier op til 99. Så hvad sker der, når FRED forsøger at oprette forbindelse?

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

Bortset fra linjenummeret og biten PHP tilføjet, er det præcis den besked, du fik.

Hvis du vil se, om der er nogen AFTER LOGON udløsere i din database, prøv at køre forespørgslen

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

På min database (Oracle 11g XE beta) får jeg følgende output:

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

Jeg tror ikke på, at Oracle logger ud af boksen, og jeg ville blive overrasket, hvis PHP's oci_connect gør heller.

Jeg kan kun spekulere i, hvorfor fejlen kun opstår for din webserver og ikke når du kører PHP fra et bash-script. Måske udløseren forespørger V$SESSION og prøver at finde ud af, hvilken brugerkonto der forsøger at oprette forbindelse til databasen?




  1. SSIS API:Hvordan ved man, hvilken grænseflade man skal caste et __COMObject til?

  2. MySQL Fulltext Boolean Mode-søgning giver for mange resultater

  3. Puma Cluster-konfiguration på Heroku

  4. Sådan finder du ud af, om et kolonnenavn er et reserveret søgeord på tværs af forskellige databaser