Estou tentando construir um gatilho de logon do Oracle 11g que restringe o acesso de um usuário específico a uma lista conhecida de aplicativos. Por exemplo, o usuário SCOTT
pode se conectar apenas com MYAPP.EXE
.
Acredito que tenho o gatilho e lógica corretos, mas o problema que estou tendo é que RAISE_APPLICATION_ERROR();
não mata a sessão.
O gatilho está ativado e tentei conceder o privilégio ADMINISTER DATABASE TRIGGER
, mas ainda sinto falta de algo.
Com base no este exemplo , aqui está o gatilho que tenho até agora (de propriedade do mesmo usuário):
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;
/
Mas o login como SCOTT
com o SQL * Plus ainda funciona. E se eu, então, consultar v$session
, com a seguinte consulta:
select username, client_identifier
from v$session
where username not in ('SYSMAN', 'DBSNMP');
Eu obtenho o seguinte resultado ..
USERNAME CLIENT_IDENTIFIER
------------------ -----------------------------------
SCOTT about to raise app_error..
O que estou perdendo? Isso é uma coisa de privilégio, uma coisa de código de gatilho ou um bug do Oracle ? Ou há uma maneira melhor de fazer o que estou tentando fazer? (Eu tenho controle total sobre o banco de dados e o servidor em que ele se encontra, se isso torna tudo mais fácil!)
Estou usando Oracle Database 11g Release 11.1.0.6.0 - Production
Muito obrigado pela sua ajuda e sugestões
Andrew: o)