我正在尝试构build一个Oracle 11glogin触发器,将特定用户的访问权限限制在一个已知的应用程序列表中。 例如,用户SCOTT只能与MYAPP.EXE连接。
我相信我有正确的触发器和逻辑,但是我遇到的问题是RAISE_APPLICATION_ERROR(); 不杀死会话。 触发器已启用,我已经尝试授予ADMINISTER DATABASE TRIGGER权限,但我仍然缺less一些东西。
基于这个例子 ,这是我迄今为止的触发器(由同一个用户拥有):
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; /
但是,使用SQL * Plus作为SCOTTlogin仍然有效。 如果我然后查询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
非常感谢您的帮助和build议
安德鲁:o)
看看汤姆KYTE的博客/问答网站asktom 。 可能有一个微妙的原因,为什么这不是你所期望的。
你的问题在这里和这里讨论两个例子。
另一种方法是使用仅由应用程序启用的APPLICATION ROLES和在应用程序中configuration的密码。
作为DBA,我不想在任何情况下通过SQLPLUS限制对数据库的访问,因为这通常是访问病态数据库的最佳途径。 并在全球触发。 没有办法matey!
Scott架构是否被授予DBAangular色? 从这个关于Asktom的讨论中 ,似乎DBA组的成员不能用ON LOGON触发器断开连接。
顺便说一句,你也将看到在这个线程为什么你的解决scheme不防弹(例如: copy sqlplus.exe foo.exe )
更新:在以下情况下,此触发器将不起作用:
你能否检查一下,触发器是否属于SCOTT?