Может ли 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
Я не могу быть гораздо более прямой помощи.