sql >> Databáze >  >> RDS >> Oracle

Může OCI_CONNECT způsobit ORA-01438:hodnotu větší, než je specifikovaná přesnost povolená pro tento sloupec?

Zpráva error occurred at recursive SQL level 1 naznačuje mi, že chyba vzniká v rámci spouštěče. Můj odhad je, že existuje AFTER LOGON ON SCHEMA nebo DATABASE a z nějakého důvodu způsobí chybu, když se proces vašeho webového serveru pokusí připojit.

Zde je příklad, jak vygenerovat chybu, která se vám zobrazuje. Mám tabulku s názvem TINY , s jedním sloupcem, který může nabývat pouze hodnot do 99:

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

Nyní vytvoříme uživatelský účet a ověříme, že se mohou připojit:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Dobře – přihlaste se jako já a vytvořte spouštěč, který způsobí chybu, pokud FRED pokusy o připojení:

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.

Připomeňme, že naše TINY tabulka může ukládat pouze hodnoty do 99. Co se tedy stane, když FRED pokusy o připojení?

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

Kromě čísla řádku a přidaného bitu PHP to je přesně ta zpráva, kterou jste dostali.

Pokud chcete zjistit, zda existují nějaké AFTER LOGON triggery ve vaší databázi, zkuste spustit dotaz

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

V mé databázi (Oracle 11g XE beta) dostávám následující výstup:

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

Nevěřím, že Oracle provádí nějaké přihlašování přímo z krabice, a byl bych překvapen, kdyby PHP oci_connect dělá buď.

Mohu pouze spekulovat o tom, proč k chybě dochází pouze pro váš webový server a ne, když spouštíte PHP z bash skriptu. Možná se spouštěč dotazuje na V$SESSION a snažíte se zjistit, jaký uživatelský účet se pokouší připojit k databázi?




  1. Co se stane, když nepotvrdíte transakci do databáze (řekněme SQL Server)?

  2. Jak opravit „překročení systémových prostředků“ při migraci na Windows 10

  3. Data tabulek Oracle do příkazů INSERT s JAVA

  4. Odfiltrujte záznamy, které nejsou v tomto formátu data oracle