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?