Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bisakah OCI_CONNECT menyebabkan nilai ORA-01438:lebih besar dari presisi yang ditentukan yang diizinkan untuk kolom ini?

Pesan error occurred at recursive SQL level 1 menyarankan kepada saya bahwa kesalahan muncul di dalam pemicu. Dugaan saya ada AFTER LOGON ON SCHEMA atau DATABASE pemicu, dan untuk beberapa alasan hal itu menyebabkan kesalahan saat proses server web Anda mencoba untuk terhubung.

Berikut ini contoh cara menghasilkan kesalahan yang Anda dapatkan. Saya memiliki tabel bernama TINY , dengan satu kolom yang hanya dapat mengambil nilai hingga 99:

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

Sekarang mari buat akun pengguna dan verifikasi bahwa mereka dapat terhubung:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Bagus - mari masuk kembali sebagai saya dan buat pemicu yang akan menyebabkan kesalahan jika FRED mencoba menghubungkan:

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.

Ingatlah bahwa TINY . kita tabel hanya dapat menyimpan nilai hingga 99. Jadi, apa yang terjadi ketika FRED mencoba terhubung?

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

Selain nomor baris, dan sedikit PHP yang ditambahkan, itulah pesan yang Anda dapatkan.

Jika Anda ingin melihat apakah ada AFTER LOGON pemicu di database Anda, coba jalankan kueri

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

Di database saya (Oracle 11g XE beta), saya mendapatkan output berikut:

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

Saya tidak percaya Oracle melakukan log out-of-the-box, dan saya akan terkejut jika oci_connect PHP juga.

Saya hanya bisa berspekulasi mengapa kesalahan hanya muncul untuk server web Anda dan bukan ketika Anda menjalankan PHP dari skrip bash. Mungkin pemicunya adalah menanyakan V$SESSION dan mencoba mencari tahu akun pengguna apa yang mencoba terhubung ke database?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan fungsi Oracle to_date untuk string tanggal dengan milidetik

  2. Pembaruan Kaskade Oracle

  3. Cegah Pemicu Sisipkan

  4. Bagaimana saya bisa melakukan pembaruan dinamis ini di Oracle?

  5. Urutan Oracle tidak menghasilkan nomor berkelanjutan