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

Мне интересно, может ли 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 ]

1 голос
/ 17 октября 2011

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

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

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

Теперь давайте создадим учетную запись пользователя и убедимся, что он может подключиться:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Хорошо - давайте снова войдем в систему как я и создадим триггер, который вызовет ошибку, если FRED попытается подключиться:

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.

Напомним, что наша таблица TINY может хранить значения только до 99. Итак, что происходит, когда FRED пытается подключиться?

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

Кроме номера строки и добавленного бита 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 1031 тоже.

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

0 голосов
/ 13 сентября 2011

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

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

...