Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Здравствуйте Уважаемые форумчане!
Заранее извиняюсь за возможно тривиальный вопрос, но уже не знаю куда копать да и голова не варит из-за недосыпа, новорожденный сынишка концерты устраивает по ночам.
Вопрос в следующем:
Написал триггер

CREATE OR REPLACE TRIGGER failed_logon_notifications
AFTER SERVERERROR ON DATABASE

DECLARE


BEGIN
IF dbms_standard.is_servererror( 28000)=true

THEN smtp_fff('zzzzzzzzzzz','ACCESS DENIDE FROM' ,'email@email.com');

END IF;
END failed_logon_notifications;


Не срабатывает строка IF dbms_standard.is_servererror( 28000)=true , пробовал также ora_is_servererror(). Причем не один код ошибки не срабатывает все время возвращается false. Предполагаю что либо в error stack не появляется событие ошибки с кодом (любым), либо где-то в словаре методанных не прописаны ошибки, он грубо говоря пустой. Но эти предположения ничем не обоснованны.
В интернете пока ничего путного не нашел.

Буду признателен любой информации и заранее благодарю всех откликнувшихся.

П\С Аудит включать не могу.
4 июн 13, 13:58    [14388933]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Miras,

1)
dbms_standard
-- error functions only search for the top 5 errors in the error stack

2)
знак не путаете?
4 июн 13, 14:11    [14389014]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
orawish,

Спасибо за участие, но не понял какой знак?
4 июн 13, 14:17    [14389048]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
hinotf
Member

Откуда: Протвино
Сообщений: 722
Знак почти наверняка. SQLCODE возвращает отрицательные значения.
4 июн 13, 14:18    [14389059]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
123йй
Member

Откуда:
Сообщений: 1639
Miras,

ORA-28000
4 июн 13, 14:19    [14389063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Всем спасибо.
Я так понял имеется ввиду : dbms_standard.is_servererror( -28000)=true ?

не работает все равно или я уже не въезжаю.
4 июн 13, 14:21    [14389080]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Miras
Всем спасибо.
Я так понял имеется ввиду : dbms_standard.is_servererror( -28000)=true ?

не работает все равно или я уже не въезжаю.

если триггер у вас таки запускается - извлеките стек ошибок, да посмотрите, что там
4 июн 13, 14:24    [14389096]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
create table caught_errors (
dt date,
username varchar2( 30), -- value from ora_login_user
msg varchar2(512),
stmt varchar2(512)
);


create or replace trigger catch_errors
after servererror on database
declare
sql_text ora_name_list_t;
msg_ varchar2(2000) := null;
stmt_ varchar2(2000) := null;
begin

for depth in 1 .. ora_server_error_depth loop
msg_ := msg_ || ora_server_error_msg(depth);
end loop;

for i in 1 .. ora_sql_txt(sql_text) loop
stmt_ := stmt_ || sql_text(i);
end loop;

insert into
caught_errors (dt , username ,msg ,stmt )
values (sysdate, ora_login_user,msg_,stmt_);
end;

Инициирую ошибку 28000

select dt, username, substr(stmt, 1, 40),msg from caught_errors;

только одна запись вызывает подозрение но видимо все равно не она:

8 04.06.2013 16:29:04 SYSMAN BEGIN EMD_NOTIFICATION.QUEUE_READY(:1, : "ORA-25254: таймаут в LISTEN при ожидании сообщения
ORA-06512: на ""SYS.DBMS_AQ"", line 675
ORA-06512: на ""SYS.DBMS_AQ"", line 702
ORA-06512: на ""SYSMAN.EMD_NOTIFICATION"", line 546
ORA-06512: на line 1
"
4 июн 13, 14:29    [14389129]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
хотя вроде оно
4 июн 13, 14:33    [14389155]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
-2-
Member

Откуда:
Сообщений: 15330
Miras,

commit все-таки лучше написать явно.
4 июн 13, 14:34    [14389158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Нашел в пакете SYSMAN.EMD_NOTIFICATION строку:

-- This raises an ORA-25254 exception if there is nothing in the queue
DBMS_AQ.LISTEN (agents, qtimeout_in, agent);

поменял на:

DBMS_AQ.LISTEN (agents, 1200, agent);

инициировал ошибку в стэке пока не появляется ошибка ORA-25254 .

Ребят есть ещё идеи?
4 июн 13, 14:50    [14389287]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Miras
.. ещё идеи?

зря, имхо, поменяли.
и на dbms_standard.is_servererror наплюйте.
разбирайте стек, внутри вашего if, как строку
4 июн 13, 15:19    [14389487]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Прошу ткните носом как сделать, если у Вас есть время конечно.
4 июн 13, 15:25    [14389532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
orawish,
Вернее помогите с этим стэком разобраться, я без понятий совсем что-то, не разу не делал такого.
4 июн 13, 15:27    [14389545]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
-2-
Member

Откуда:
Сообщений: 15330
Miras
Прошу ткните носом как сделать, если у Вас есть время конечно.
сначала убери из триггера код, который приводит ошибке до инсерта, а после инсерта поставь commit.
4 июн 13, 15:27    [14389547]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Вот так:

create or replace trigger catch_errors
after servererror on database
declare
sql_text ora_name_list_t;
msg_ varchar2(2000) := null;
stmt_ varchar2(2000) := null;
begin

/*for depth in 1 .. ora_server_error_depth loop
msg_ := msg_ || ora_server_error_msg(depth);
end loop;

for i in 1 .. ora_sql_txt(sql_text) loop
stmt_ := stmt_ || sql_text(i);
end loop;
*/
insert into
caught_errors (dt , username ,msg ,stmt )
values (sysdate, ora_login_user,msg_,stmt_);
commit;
end;


???
4 июн 13, 15:30    [14389589]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Miras,

есть сомнение, что SERVERERROR тут, вообще, имеет место.
коннекта же нет и (таки не было), а клиент -28000 получает
4 июн 13, 15:51    [14389738]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Хотя в интернете куча примеров на эту тему и у всех все работает.
Вот я и думаю, что может быть не так у меня, проверял на всех своих базах версии 10 и 11.
4 июн 13, 15:54    [14389777]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
123йй
ORA-28000


Да ну:

SQL> select  *
  2    from  v$version
  3  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> CREATE OR REPLACE
  2    TRIGGER failed_logon_notifications
  3      AFTER SERVERERROR
  4      ON DATABASE
  5      BEGIN
  6          IF dbms_standard.is_servererror(-28000) = true
  7            THEN
  8              RAISE_APPLICATION_ERROR(-20500,'!!!!!!!!!!!!!!!!!!!!!!');
  9          END IF;
 10  END failed_logon_notifications;
 11  /

Trigger created.

SQL> alter user u1 account lock
  2  /

User altered.

SQL> connect u1@orcl/u1
ERROR:
ORA-28000: the account is locked


Warning: You are no longer connected to ORACLE.
SQL> connect scott
Enter password: **********
Connected.
SQL> CREATE OR REPLACE
  2    TRIGGER failed_logon_notifications
  3      AFTER SERVERERROR
  4      ON DATABASE
  5      BEGIN
  6          IF dbms_standard.is_servererror(28000) = true
  7            THEN
  8              RAISE_APPLICATION_ERROR(-20500,'!!!!!!!!!!!!!!!!!!!!!!');
  9          END IF;
 10  END failed_logon_notifications;
 11  /

Trigger created.

SQL> connect u1@orcl/u1
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-20500: !!!!!!!!!!!!!!!!!!!!!!
ORA-06512: at line 4
ORA-28000: the account is locked


Warning: You are no longer connected to ORACLE.
SQL> 


Сообщение было отредактировано: 4 июн 13, 20:31
4 июн 13, 20:29    [14391092]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
-2-
Member

Откуда:
Сообщений: 15330
Если что, пример из доки гласит про положительный аргумент
CREATE TRIGGER log_errors
  AFTER SERVERERROR ON DATABASE
  BEGIN
    IF (IS_SERVERERROR (1017)) THEN
      NULL;  -- (substitute code that processes logon error)
    ELSE
      NULL;  -- (substitute code that logs error code)
    END IF;
  END;
/
и без указания dbms_standard.
4 июн 13, 20:39    [14391119]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
SY,

Вот хоть убейте не пойму как так у Вас получается.
У меня по прежнему не работает.
Повторюсь что строка
IF (is_servererror(28000))=true
мне возвращает false.

Стек который собирает триггер описанный выше, ничего не видит по поводу этой ошибки.
Возможно я неправильно написал триггер сбора стэка, может кто подскажет как грамотней написать сбор стэка?
5 июн 13, 08:07    [14392170]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Баги 10067294, 9864448
Подробности на MOS
5 июн 13, 08:14    [14392192]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Ещё такой момент.
Мой триггер сбора стэка ловит такую ошибку: ORA-02291: integrity constraint

Я этот номер поставил вместо 28000:
is_servererror(02291)

и все нормально условие возвращает true.
5 июн 13, 08:17    [14392201]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Вячеслав Любомудров,
Здравствуйте!
Я так понимаю имеется ввиду Металинк, но у меня нет доступа. Может вы вкратце обрисуете ситуацию?
Видимо нужно пропатчить до версии 11.2.0.3 (в предыдущих постах в этой версии на примере работало), т.к. у меня 11.2.0.2.
5 июн 13, 08:20    [14392210]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с триггером AFTER SERVERERROR ON DATABASE  [new]
Miras
Member

Откуда:
Сообщений: 25
Вопрос закрыт, всем спасибо за участие.
5 июн 13, 09:12    [14392370]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить