Может ли OCI_CONNECT вызвать ORA-01438: значение, превышающее указанную точность, разрешенную для этого столбца?

Мне интересно, если oci_connect() может вызвать ошибку 1438, потому что я получаю это все время:

Предупреждение: oci_connect() [function.oci-connect]: ORA-00604: ошибка произошла на уровне рекурсивного SQL 1 ORA-01438: значение, превышающее указанную точность, разрешенную для этого столбца ORA-06512: в строке 8 в /xxxxxx/some. PHP на линии 220

Это не зависит от того, какая таблица запрашивается. Похоже, что oci_connect() вставляет некоторый трекингстаф в некоторую таблицу sys, или, возможно, триггер связан с входом в систему. Но у меня нет разрешения, чтобы выяснить эту проблему в sys.

Любая идея, что может быть причиной этой ошибки?

Обновить

Оракул делает автоматическую регистрацию в каком-либо месте без специальной настройки? Могу ли я как-нибудь позволить оракулу или PHP показать мне, какая таблица или столбец затронуты?

Обновление Я обнаружил, что когда я вызываю PHP Script в Bash напрямую, он работает нормально. Но звонок из интернета вызовет проблему с названием. Любая идея?

2 ответа

Решение

Сообщение error occurred at recursive SQL level 1 предлагает мне, что ошибка возникает в триггере. Я думаю, что есть AFTER LOGON ON SCHEMA или же DATABASE триггер, и по какой-то причине это вызывает ошибку, когда процесс вашего веб-сервера пытается подключиться.

Вот пример того, как генерировать полученную ошибку. У меня есть стол TINYс одним столбцом, который может принимать значения только до 99:

SQL> desc tiny;
 Имя Нуль? Тип
 ----------------------------------------- -------- ----------------------------
 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 OWNER
------------------------------ -------------------- ----------
AFTER_LOGON_ERROR_IF_FRED LUKE

Я не верю, что Oracle выполняет вход в систему из коробки, и я был бы удивлен, если бы PHP oci_connect делает тоже.

Я могу только предположить, почему ошибка возникает только для вашего веб-сервера, а не при запуске PHP из скрипта bash. Возможно, триггер запрашивает V$SESSION и пытаясь выяснить, какая учетная запись пользователя пытается подключиться к базе данных?

Ну, в зависимости от столбца, вы либо пытаетесь вставить число, которое больше, чем допустимые границы для numeric столбец, или вы пытаетесь вставить строку в varchar2(n) столбец длиннее n персонажи. Вот больше подробностей о типах данных Oracle.

Без более конкретной информации о том, что вставляется в какой столбец в какой таблице в строке 220 some.phpЯ не могу быть гораздо более прямой помощи.

Другие вопросы по тегам