Я пытаюсь создать триггер входа в 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 ни при каких обстоятельствах, поскольку это часто лучший способ получить доступ к нездоровой базе данных. И иметь это в глобальном триггере. Ни за что, дружище!