powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как поймать аудитом тот SQL который огребает ошибку?
15 сообщений из 15, страница 1 из 1
Как поймать аудитом тот SQL который огребает ошибку?
    #39260831
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внешняя система с недоступным исходным кодом посылаeт на нашу базу запросы один из которых огребает ORA-ошибку? Как поймать аудитом именно этот SQL-запрос?

Если делаю
авторAudit of somefuckuser.... Whenever not successful,
То вижу в trail-таблице только те таблицы, к которым запрос обращался! Как поймать сам запрос?(eго текст и, возможно, его bind-variables)
Особенно если он уже, предположим, ушёл уже через 5 секунд из v$sqlarea?
(дело происходит на 12с, SE)
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260838
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
alter system set audit_trail = 'DB_EXTENDED' scope = spfile



restart

насчет SQL, генерящего ошибку, не подскажу, не занимался
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260840
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260841
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только вот я упустил из виду, что в SQL_MONITOR попадают лишь запросы длиной > 5 мин..
(ну или с хинтом ..)
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260842
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу.. 5 сек, конечно
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260844
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViktorWMВнешняя система с недоступным исходным кодом посылаeт на нашу базу запросы один из которых огребает ORA-ошибку? Как поймать аудитом именно этот SQL-запрос?

Если делаю
авторAudit of somefuckuser.... Whenever not successful,
То вижу в trail-таблице только те таблицы, к которым запрос обращался! Как поймать сам запрос?(eго текст и, возможно, его bind-variables)
Особенно если он уже, предположим, ушёл уже через 5 секунд из v$sqlarea?
(дело происходит на 12с, SE)
собрать трассировки, если с байнд - 4 уровня
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260852
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ViktorWM,

для примера:
trigger on servererror on SCHEMAcreate table ERROR_LOG
(
id NUMBER,
username VARCHAR2(30),
errcode INTEGER,
seq INTEGER,
tmstmp TIMESTAMP(6),
msg VARCHAR2(4000),
sql_text CLOB
)
/
create sequence err_seq
/
create or replace trigger trg_error_logging
after servererror
on schema
declare
v_id number := err_seq.nextval();
v_tmstmp timestamp:= systimestamp;
n int;
sql_text dbms_standard.ora_name_list_t;
v_sql_text clob;
begin
v_sql_text:=null;
n := ora_sql_txt(sql_text);
for i in 1..n loop
v_sql_text := v_sql_text || sql_text(i);
end loop;

for i in 1.. ora_server_error_depth
loop
if i=1 then
insert into error_log(id,seq,tmstmp,username,errcode,msg,sql_text)
values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i), v_sql_text);
else
insert into error_log(id,seq,tmstmp,username,errcode,msg)
values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i) );
end if;
end loop;
commit;
END;
/
-- если все без ошибок, то включаем:
alter trigger trg_error_logging enable
/

потом просто глянуть в табличку error_log. Как найдете виновника - вырубайте
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260853
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
xtenderViktorWM,

для примера:
trigger on servererror on SCHEMA
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
create table ERROR_LOG
(
  id       NUMBER,
  username VARCHAR2(30),
  errcode  INTEGER,
  seq      INTEGER,
  tmstmp   TIMESTAMP(6),
  msg      VARCHAR2(4000),
  sql_text CLOB
)
/
create sequence err_seq
/
create or replace trigger trg_error_logging
after servererror
on schema
declare
   v_id       number   := err_seq.nextval();
   v_tmstmp   timestamp:= systimestamp;
   n          int;
   sql_text   dbms_standard.ora_name_list_t;
   v_sql_text clob;
begin
   v_sql_text:=null;
   n := ora_sql_txt(sql_text);
   for i in 1..n loop
      v_sql_text := v_sql_text || sql_text(i);
   end loop;

   for i in 1.. ora_server_error_depth
   loop
      if i=1 then
         insert into error_log(id,seq,tmstmp,username,errcode,msg,sql_text)
            values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i), v_sql_text);
      else
         insert into error_log(id,seq,tmstmp,username,errcode,msg)
            values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i) );
      end if;
   end loop;
   commit;
END;
/
-- если все без ошибок, то включаем:
alter trigger trg_error_logging enable
/


потом просто глянуть в табличку error_log. Как найдете виновника - вырубайтетег src забыл
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260854
on servererror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViktorWM,

клиентская трассировка, всякие sql monitor или триггер. но может быть сначала стоило озвучить код и текст ошибки.
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260857
ViktorWM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Cпасибо огромное!
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39260886
veep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViktorWMxtender,

Cпасибо огромное!

Добрый день. На наших базах стоит что то типа триггера ONERROR который всю инфу сбрасывает в отдельную табличку(включая SQL). Подробности сказать не могу, не на работе. У нас такая фигня стоит на каждой базе. По перфомансу это не напрягает базу, но помогает здорово.
Когда кастомеры спрашивают - Чето приложение нифига не пашет как надо а ошибок на экране нет. Я в первую очередь в эту табличку смотрю.
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39261374
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtenderViktorWM,

для примера:
trigger on servererror on SCHEMAcreate table ERROR_LOG
(
id NUMBER,
username VARCHAR2(30),
errcode INTEGER,
seq INTEGER,
tmstmp TIMESTAMP(6),
msg VARCHAR2(4000),
sql_text CLOB
)
/
create sequence err_seq
/
create or replace trigger trg_error_logging
after servererror
on schema
declare
v_id number := err_seq.nextval();
v_tmstmp timestamp:= systimestamp;
n int;
sql_text dbms_standard.ora_name_list_t;
v_sql_text clob;
begin
v_sql_text:=null;
n := ora_sql_txt(sql_text);
for i in 1..n loop
v_sql_text := v_sql_text || sql_text(i);
end loop;

for i in 1.. ora_server_error_depth
loop
if i=1 then
insert into error_log(id,seq,tmstmp,username,errcode,msg,sql_text)
values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i), v_sql_text);
else
insert into error_log(id,seq,tmstmp,username,errcode,msg)
values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i) );
end if;
end loop;
commit;
END;
/
-- если все без ошибок, то включаем:
alter trigger trg_error_logging enable
/

потом просто глянуть в табличку error_log. Как найдете виновника - вырубайте

здесь стоит отметить, что если хотя бы какой-то перехват с обработкой ошибок делается в "прямом", не триггерном PL/SQL коде (а разработки на PL/SQL минимально профессионального уровня без этого быть не может), то эта обработка после такого триггера уже не cработает. То есть логика работы софта нарушится. Raise в триггере after servererror не проходит.
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39261399
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Nobody1111xtender...

здесь стоит отметить, что если хотя бы какой-то перехват с обработкой ошибок делается в "прямом", не триггерном PL/SQL коде (а разработки на PL/SQL минимально профессионального уровня без этого быть не может), то эта обработка после такого триггера уже не cработает. То есть логика работы софта нарушится. Raise в триггере after servererror не проходит.

С чего бы?!
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
SQL> create table ERROR_LOG
  2  (
  3    id       NUMBER,
  4    username VARCHAR2(30),
  5    errcode  INTEGER,
  6    seq      INTEGER,
  7    tmstmp   TIMESTAMP(6),
  8    msg      VARCHAR2(4000),
  9    sql_text CLOB
 10  )
 11  /

Table created.

SQL> create sequence err_seq
  2  /

Sequence created.

SQL> create or replace trigger trg_error_logging
  2  after servererror
  3  on schema
  4  declare
  5     v_id       number   := err_seq.nextval();
  6     v_tmstmp   timestamp:= systimestamp;
  7     n          int;
  8     sql_text   dbms_standard.ora_name_list_t;
  9     v_sql_text clob;
 10  begin
 11     v_sql_text:=null;
 12     n := ora_sql_txt(sql_text);
 13     for i in 1..n loop
 14        v_sql_text := v_sql_text || sql_text(i);
 15     end loop;
 16
 17     for i in 1.. ora_server_error_depth
 18     loop
 19        if i=1 then
 20           insert into error_log(id,seq,tmstmp,username,errcode,msg,sql_text)
 21              values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i), v_sql_text);
 22        else
 23           insert into error_log(id,seq,tmstmp,username,errcode,msg)
 24              values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i) );
 25        end if;
 26     end loop;
 27     commit;
 28  END;
 29  /

Trigger created.

SQL> alter trigger trg_error_logging enable
  2  /

Trigger altered.

SQL> set serverout on;
SQL> begin
  2      declare
  3          i int:=0;
  4      begin
  5          i:=1/i;
  6      exception when others then
  7          dbms_output.put_line('e1');
  8          raise;
  9      end;
 10  exception when others then
 11      dbms_output.put_line('e2');
 12      raise;
 13  end;
 14  /
e1
e2
>>>begin
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 12
<<<

SQL> col msg for a120;
SQL> select id,seq,errcode,msg from error_log;

        ID        SEQ    ERRCODE MSG
---------- ---------- ---------- ------------------------------------------------------------------------------------------------------------------------
         1          1       1476 ORA-01476: divisor is equal to zero
         1          2       6512 ORA-06512: at line 12

2 rows selected.

SQL> col msg clear;


Вот если "проглатывать" ошибки, то тогда, конечно, триггер не сработает - не залоггирует ошибку, т.к. этот триггер на возврат ошибки клиенту, но это сами себе злые буратины, если ошибку проглотили и не залоггировали.
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39261420
Nobody1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, верно, очередность перехвата другая
...
Рейтинг: 0 / 0
Как поймать аудитом тот SQL который огребает ошибку?
    #39261427
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
trigger on servererror on SCHEMA
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
create table ERROR_LOG
(
  id       NUMBER,
  username VARCHAR2(30),
  errcode  INTEGER,
  seq      INTEGER,
  tmstmp   TIMESTAMP(6),
  msg      VARCHAR2(4000),
  sql_text CLOB
)
/
create sequence err_seq
/
create or replace trigger trg_error_logging
after servererror
on schema
disabled
declare
   v_id       number   := err_seq.nextval();
   v_tmstmp   timestamp:= systimestamp;
   n          int;
   sql_text   dbms_standard.ora_name_list_t;
   v_sql_text clob;
begin
   v_sql_text:=null;
   n := ora_sql_txt(sql_text);
   for i in 1..n loop
      v_sql_text := v_sql_text || sql_text(i);
   end loop;

   for i in 1.. ora_server_error_depth
   loop
      if i=1 then
         insert into error_log(id,seq,tmstmp,username,errcode,msg,sql_text)
            values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i), v_sql_text);
      else
         insert into error_log(id,seq,tmstmp,username,errcode,msg)
            values( v_id, i, v_tmstmp, user, ora_server_error(i), ora_server_error_msg(i) );
      end if;
   end loop;
   commit;
END;
/
-- если все без ошибок, то включаем:
alter trigger trg_error_logging enable
/


поправил - забыл слово disabled
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как поймать аудитом тот SQL который огребает ошибку?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]