ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
The error was clear, the application was trying to execute an SQL statement against a table that was not in database, or the user did not have permissions. But, which table or view was that?
In order to discover the SQL the client was invoking I found this post: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2975793633621#284628100346267414. In my post I´ll just refactor it in order to easy understanding.
The idea behind of this is to register a trigger for server error 942, obtain context information and the sql being executed, and save all this info in other table. The complete code is as follow:
-- Table to store errors create table ERROR942 (id number, "time" timestamp, "event" varchar(100), "user" varchar(100), "server_error" varchar2(4000), "sql" varchar2(4000) ); -- Sequence to generate the table id create sequence SEQ_ERROR942; -- Trigger to insert errors in table create or replace trigger TGR_SERVER942 after servererror on database declare l_sql_text ora_name_list_t; full_sql varchar2(4000); l_n number; begin if ( is_servererror(942) ) then full_sql := ''; l_n := ora_sql_txt( l_sql_text ); for i in 1 .. l_n loop full_sql := full_sql || l_sql_text(i); end loop; insert into ERROR942 values (SEQ_ERROR942.nextval, current_date, ora_sysevent, ora_login_user, ora_server_error(1), full_sql); end if; end; commit;
The main aspects here are:
- We create ERROR942 table in order to store all errors
- We create SEQ_ERROR942 in order to generate the previous table ids
- We create TGR_SERVER942 trigger in order to capture server errors and store then in the table.
You can test the solution as follow:
select * from UNEXIST_TABLE; select * ERROR942;
No hay comentarios:
Publicar un comentario