Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

OCI_CONNECT có thể gây ra giá trị ORA-01438:lớn hơn độ chính xác được chỉ định cho phép cho cột này không?

Thông báo error occurred at recursive SQL level 1 gợi ý cho tôi rằng lỗi đang phát sinh trong một trình kích hoạt. Tôi đoán là có AFTER LOGON ON SCHEMA hoặc DATABASE và vì một số lý do, nó gây ra lỗi khi quá trình máy chủ web của bạn cố gắng kết nối.

Đây là một ví dụ về cách tạo ra lỗi mà bạn đang gặp phải. Tôi có một bảng tên là TINY , với một cột chỉ có thể nhận giá trị tối đa 99:

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

Bây giờ, hãy tạo một tài khoản người dùng và xác minh rằng họ có thể kết nối:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Tốt - hãy đăng nhập lại với tư cách là tôi và tạo trình kích hoạt sẽ gây ra lỗi nếu FRED cố gắng kết nối:

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.

Nhớ lại rằng TINY của chúng tôi bảng chỉ có thể lưu trữ các giá trị tối đa 99. Vì vậy, điều gì sẽ xảy ra khi FRED cố gắng kết nối?

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

Ngoài số dòng và bit PHP được thêm vào, đó chính xác là thông báo bạn nhận được.

Nếu bạn muốn xem có bất kỳ AFTER LOGON không kích hoạt trong cơ sở dữ liệu của bạn, hãy thử chạy truy vấn

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

Trên cơ sở dữ liệu của tôi (Oracle 11g XE beta), tôi nhận được kết quả sau:

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

Tôi không tin Oracle thực hiện bất kỳ thao tác đăng nhập nào và tôi sẽ ngạc nhiên nếu oci_connect của PHP cũng vậy.

Tôi chỉ có thể suy đoán tại sao lỗi chỉ phát sinh đối với máy chủ web của bạn chứ không phải khi bạn chạy PHP từ tập lệnh bash. Có lẽ trình kích hoạt đang truy vấn V$SESSION và cố gắng tìm ra tài khoản người dùng nào đang cố gắng kết nối với cơ sở dữ liệu?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kiểm tra xem một cột có bằng blank_clob () trong Oracle hay không?

  2. oracle - chuỗi không có chuỗi

  3. Giải pháp cho kết nối bên ngoài với toán tử IN trong Oracle

  4. DatabaseMetaData.getColumns trả về một ResultSet trống cho các từ đồng nghĩa

  5. Ngoại lệ Java Oracle - số biểu thức tối đa trong danh sách là 1000