Получение дополнительных сообщений при выполнении триггера - PullRequest
3 голосов
/ 31 января 2012

Я столкнулся с проблемой при создании триггера БД, чтобы вызвать сообщение об ошибке для форм оракула.Не могли бы вы мне помочь?

Мой код:

CREATE OR REPLACE TRIGGER unsuccessful_attempts_lock
      BEFORE UPDATE of last_logon_date 
ON temp_user
FOR EACH ROW

DECLARE
CURSOR c_unsuccessful_attempts IS
  SELECT *
  FROM temp_unsuccessful_attempts
  WHERE user_id=:NEW.user_id; 
max_fails EXCEPTION;

BEGIN
   FOR r_unsuccessful_attempts IN c_unsuccessful_attempts
   LOOP
     IF(r_unsuccessful_attempts.locked ='Y') THEN
       RAISE max_fails;
     END IF;
   END LOOP;
EXCEPTION
  WHEN max_fails THEN
  FND_MESSAGE.SET_NAME ('FND', 'FLEX-USER DEFINED ERROR');
  FND_MESSAGE.SET_TOKEN ('MSG', 'You have reached maximum failed logins. 
                This account has been locked temporarily. Please contact 
                your system administrator')
  FND_MESSAGE.RAISE_ERROR;
  WHEN OTHERS THEN
  RAISE_APPLICATION_ERROR(-20400,'An error has occured.Please contact 
                 your system administrator'||SQLCODE||SQLERRM);
END unsuccessful_attempts_lock;

Когда учетная запись пользователя заблокирована, temp_unsuccessful_attempts.locked будет обновлено до 'Y', и он / она не долженвозможность войти в систему дальше.И temp_user - это таблица, которая обновляется при успешном входе пользователя в систему.

Итак, когда учетная запись пользователя заблокирована (temp_unsuccessful_attempts.locked='Y'), а затем, если он попытается войти в систему со своим правильным паролемЭтот триггер должен сработать (после обновления таблицы temp_user), а форма должна выдать ошибку о том, что его учетная запись заблокирована и не должна двигаться дальше.

Сообщение, которое я получаю:

Ошибка ORACLE -20001: ORA-20001: ОШИБКА, ОПРЕДЕЛЕННАЯ ПОЛЬЗОВАТЕЛЕМ FLEX: N, MSG, Вы достигли максимального числа неудачных входов в систему.Обратитесь к системному администратору.

ORA-06512: по адресу "APPS.FND_MESSAGE", строка 66

ORA-06512: по адресу "APPS.UNSUCCESSFUL_ATTEMPTS_LOCKS", строка 38

ORA-04088: ошибка при освобождении триггера 'APPS.UNSUCCESSFUL_ATTEMPTS_LOCKS' обнаружена в FND_SIGNON.NEW_SESSION.

Мой триггер выдает дополнительное сообщение на экране приложений оракула.Я просто хочу отобразить

Вы достигли максимального числа неудачных входов в систему. Ваша учетная запись временно заблокирована. Пожалуйста, свяжитесь со службой поддержки.

PS: FND_SIGNON.NEW_SESSION - это процедура, в которойОбновляется файл temp_user.last_logon_date.

1 Ответ

2 голосов
/ 31 января 2012

Здесь мы используем функцию, которая получает первую ошибку стека:

function strip_first_error(pcode in number, pmessage in varchar2) return varchar2 is
    --
    vpos number := instr(pmessage, 'ORA-', 5);
    --
  begin
    if pcode between 20000 and 20999 then
      if vpos != 0 then
        return( substr(substr(pmessage, 1, vpos -2 ),12) );
      else
        return( substr(pmessage,12) );
      end if;
    else
      return pmessage;
    end if;
  end;

И использование:

when others then
    message(strip_first_error(abs(sqlcode), sqlerrm));

РЕДАКТИРОВАТЬ

PS: это когда другие, которые обрабатывают ошибки в вызове вашего update.В вашем конкретном примере должно быть:

begin
  update last_logon_date ...
exception
    when others then
      -- in forms you should use message or other function that display the error
      -- in pl/sql you should use dbms_output.put_line, for example.
      dbms_output.put_line( strip_first_error(abs(sqlcode) , sqlerrm) );
end;
...