该消息error occurred at recursive SQL level 1
向我表明错误是在触发器中出现的。我的猜测是有一个AFTER LOGON ON SCHEMA
或DATABASE
触发器,并且由于某种原因,当您的 Web 服务器进程尝试连接时它会导致错误。
这是一个如何生成您遇到的错误的示例。我有一个名为 的表TINY
,其中有一列最多只能取 99 的值:
SQL> 描述小;
名称空?类型
----------------------------------------- -------- - --------------------------
N 号码(2)
现在让我们创建一个用户帐户并验证他们是否可以连接:
SQL>创建由fred账号解锁标识的用户fred;
用户创建。
SQL> 授予连接到弗雷德;
格兰特成功了。
SQL> 连接弗雷德/弗雷德
连接的。
FRED
好 - 让我们以我的身份重新登录并创建一个触发器,如果尝试连接会导致错误:
SQL> 连接卢克/密码
连接的。
SQL> 创建或替换触发器 after_logon_error_if_fred
2 登录数据库后
3 开始
4 如果用户 = 'FRED' 那么
5 插入微小 (n) 值 (100);
6 结束如果;
7 结束;
8 /
触发器已创建。
回想一下,我们的TINY
表最多只能存储 99 个值。那么,当FRED
尝试连接时会发生什么?
SQL> 连接弗雷德/弗雷德
错误:
ORA-00604: 递归 SQL 级别 1 发生错误
ORA-01438: 该列允许的值大于指定的精度
ORA-06512: 在第 3 行
除了行号和 PHP 添加的位之外,这正是您得到的消息。
如果您想查看数据库中是否有任何AFTER LOGON
触发器,请尝试运行查询
SELECT trigger_name, owner FROM all_triggers
WHERE TRIM(triggering_event) = 'LOGON';
在我的数据库(Oracle 11g XE beta)上,我得到以下输出:
TRIGGER_NAME 所有者
------------------------------ -------------------- ----------
AFTER_LOGON_ERROR_IF_FRED LUKE
我不相信 Oracle 做任何开箱即用的日志记录,如果 PHPoci_connect
做任何事情我都会感到惊讶。
我只能推测为什么错误只出现在您的 Web 服务器上,而不是当您从 bash 脚本运行 PHP 时出现。也许触发器正在查询V$SESSION
并试图找出正在尝试连接到数据库的用户帐户?