Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy OCI_CONNECT może spowodować ORA-01438:wartość większą niż określona precyzja dozwolona dla tej kolumny?

Komunikat error occurred at recursive SQL level 1 sugeruje mi, że błąd pojawia się w spuście. Domyślam się, że istnieje AFTER LOGON ON SCHEMA lub DATABASE wyzwalacz i z jakiegoś powodu powoduje błąd, gdy proces serwera WWW próbuje się połączyć.

Oto przykład, jak wygenerować wyświetlany błąd. Mam tabelę o nazwie TINY , z pojedynczą kolumną, która może przyjmować tylko wartości do 99:

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

Teraz utwórzmy konto użytkownika i sprawdźmy, czy mogą się połączyć:

SQL> create user fred identified by fred account unlock;

User created.

SQL> grant connect to fred;

Grant succeeded.

SQL> connect fred/fred
Connected.

Dobrze - zalogujmy się ponownie jako ja i utwórzmy wyzwalacz, który spowoduje błąd, jeśli FRED próby połączenia:

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.

Przypomnij sobie, że nasz TINY tabela może przechowywać tylko wartości do 99. A więc, co się dzieje, gdy FRED próbuje się połączyć?

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

Poza numerem linii i dodanym bitem PHP, jest to dokładnie ta wiadomość, którą otrzymałeś.

Jeśli chcesz zobaczyć, czy są jakieś AFTER LOGON wyzwalacze w Twojej bazie danych, spróbuj uruchomić zapytanie

SELECT trigger_name, owner FROM all_triggers
 WHERE TRIM(triggering_event) = 'LOGON';

W mojej bazie danych (Oracle 11g XE beta) otrzymuję następujące dane wyjściowe:

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

Nie wierzę, że Oracle robi jakiekolwiek logowanie po wyjęciu z pudełka i byłbym zaskoczony, gdyby oci_connect PHP robi albo.

Mogę tylko spekulować, dlaczego błąd pojawia się tylko dla twojego serwera WWW, a nie podczas uruchamiania PHP ze skryptu bash. Być może wyzwalacz wysyła zapytanie do V$SESSION i próbujesz dowiedzieć się, które konto użytkownika próbuje połączyć się z bazą danych?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja ACCEPT w Oracle PL SQL

  2. Przyspiesz operacje wstawiania zbiorczego dzięki NHibernate

  3. Czy mogę zwrócić wartości do PHP z anonimowego bloku PL/SQL?

  4. Połączenie Php Oracle:oci_connect():ORA-24315:błąd nieprawidłowego typu atrybutu

  5. Problem z odejmowaniem daty w Oracle