Назад | Перейти на главную страницу

Отключение сеанса Oracle от триггера входа в систему

Я пытаюсь создать триггер входа в Oracle 11g, который ограничивает доступ для определенного пользователя к известному списку приложений. Например, пользователь SCOTT может только соединиться с MYAPP.EXE.

Я считаю, что у меня правильный триггер и логика, но проблема в том, что RAISE_APPLICATION_ERROR(); не убивает сеанс. Триггер включен, и я попытался предоставить ADMINISTER DATABASE TRIGGER привилегия, но я все еще что-то упускаю.

На основе этот пример, вот триггер, который у меня есть (принадлежит тому же пользователю):

CREATE OR REPLACE TRIGGER global_logon_trg AFTER logon ON DATABASE
DECLARE
   p_session_user  varchar2(64);
   p_module        varchar2(64);
BEGIN
   SELECT UPPER(SYS_CONTEXT('USERENV', 'SESSION_USER')) INTO p_session_user FROM DUAL;
   SELECT UPPER(SYS_CONTEXT('USERENV', 'MODULE')) INTO p_module FROM DUAL;

   DBMS_SESSION.SET_IDENTIFIER(p_session_user || '-' || p_module);

   IF ((p_session_user = 'SCOTT') AND (p_module IN ('MYAPP.EXE'))) THEN
      DBMS_SESSION.SET_IDENTIFIER('about to raise app_error..');
      RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
   END IF;

END;
/

Но вход в систему как SCOTT с SQL * Plus все еще работает. И если я тогда запрошу v$session, со следующим запросом:

select username, client_identifier
from v$session
where username not in ('SYSMAN', 'DBSNMP');

Получаю следующий результат ..

USERNAME           CLIENT_IDENTIFIER
------------------ -----------------------------------
SCOTT              about to raise app_error..

Что мне не хватает? Это привилегии, код триггера или Ошибка Oracle вещь? Или есть лучший способ сделать то, что я пытаюсь сделать ?! (У меня есть полный контроль над базой данных и сервером, на котором она находится, если это облегчит задачу!)

я использую Oracle Database 11g Release 11.1.0.6.0 - Production

Большое спасибо за вашу помощь и предложения

Андрей: о)

Была ли схема Скотта назначена на роль администратора баз данных? Из это обсуждение на Асктоме, кажется, член группы DBA не может быть отключен с помощью триггера ON LOGON.

Кстати, в этой ветке вы также увидите, почему ваше решение не является пуленепробиваемым (например: copy sqlplus.exe foo.exe)

Обновить: Кроме того, этот триггер не сработает в следующих случаях:

  • владелец спускового крючка - СКОТТ (т.е. он не будет отключен, если он действительно владеет спусковым крючком, это должно быть сделано для предотвращения случайной самоблокировки),
  • у пользователя есть привилегия Администрирование триггера базы данных

Не могли бы вы проверить, принадлежит ли триггер SCOTT?

Посетите блог / сайт вопросов и ответов TOM KYTE Asktom. Может быть тонкая причина, почему это не работает так, как вы ожидали.

Ваша проблема обсуждалась Вот и Вот для двух примеров.

Альтернативой является использование РОЛИ ПРИЛОЖЕНИЯ, которые разрешены только приложением, и пароль, настроенный в приложении.

Как администратор базы данных я не хотел бы ограничивать доступ к базе данных через SQLPLUS ни при каких обстоятельствах, поскольку это часто лучший способ получить доступ к нездоровой базе данных. И иметь это в глобальном триггере. Ни за что, дружище!