Oracle
 sql >> база данни >  >> RDS >> Oracle

Може ли OCI_CONNECT да причини ORA-01438:стойност, по-голяма от определената точност, разрешена за тази колона?

Съобщението 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 бета) получавам следния резултат:

TRIGGER_NAME                   OWNER
------------------------------ ------------------------------
AFTER_LOGON_ERROR_IF_FRED      LUKE

Не вярвам, че Oracle извършва някакво логване извън кутията и бих се изненадал, ако oci_connect на PHP прави едно от двете.

Мога само да предполагам защо грешката възниква само за вашия уеб сървър, а не когато стартирате PHP от bash скрипт. Може би тригерът прави заявка V$SESSION и се опитвате да разберете кой потребителски акаунт се опитва да се свърже с базата данни?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заявка за изчисляване на разстоянието Lat Lon Distance в Oracle

  2. Актуализирайте колоната със стойности от друга колона

  3. Не е валиден месец в Oracle, когато се използва add_months

  4. План за изпълнение на Oracle

  5. Групирайте редове въз основа на сумата на колоната