Триггер Oracle: поднять_приложение_еррор - PullRequest
1 голос
/ 24 февраля 2009

Я хочу использовать процедуру lift_application_error, чтобы остановить процесс входа в систему. Я написал триггер, который проверяет строку TERMINAL, если она верна (я знаю, что это не совсем безопасно, но сначала этого достаточно) Таким образом, триггер работает нормально и делает то, что я хочу, но поднять lift_application_error вызывает откат и отправляет не исключение, которое я хочу. Когда я захожу в БД с моим Приложением, Raise_application_error не останавливает приложение. Первый вопрос: это правильный путь, чтобы остановить вход в БД с неправильным приложением? Второй вопрос: если да, то что не так?

create or replace
TRIGGER after_logon_on_database 
AFTER LOGON ON DATABASE
BEGIN
IF sys_context('USERENV', 'TERMINAL')='IAS' THEN
  INSERT INTO event_log
  (event_date, event_time, username, event_case, event_comment)
  VALUES
  (SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-SUCCESS', sys_context('USERENV', 'TERMINAL'));
ELSE
  INSERT INTO event_log
  (event_date, event_time, username, event_case, event_comment)
  VALUES
  (SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-FAILURE', sys_context('USERENV', 'TERMINAL'));
  RAISE_APPLICATION_ERROR(-20001, 'Access denied!');
END IF;
END after_logon_on_database;

Ответы [ 2 ]

1 голос
/ 24 февраля 2009

Прочтите это спросить Том-нить: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3236035522926

0 голосов
/ 24 февраля 2009

Во второй части IF / ELSE добавить коммит; Заявление между Вставкой и Подъемом. Это обеспечит правильную вставку сообщения об ошибке входа в базу данных.

Вы знаете, что триггер при входе в систему не остановит пользователя от входа в систему, если он является администратором баз данных (с ролью DAB). Эта функция гарантирует, что кто-то всегда может получить доступ к базе данных, чтобы исправить неисправный триггер при входе в систему.

Вы также правы в том, что триггер не вызовет (как первое сообщение об ошибке, возвращенное Oracle) ошибку -20001. Вместо этого он вернет -604 (ORA-00604: ошибка произошла на рекурсивном уровне SQL 1). Вы не выполняете триггер непосредственно при входе в систему, он выполняется за несколько шагов. Вы хотите, чтобы ваше приложение правильно обрабатывало эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...