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