EXAMPLE ) 有时候我们不希望使用者利用ODBC来连接上资料库利用ACCESS或者EXCEL来抓资料库资料在道德劝说无效下就直接挡下来! BEGIN FOR rec in (select usernameprogramSYS_CONTEXT(USERENVIP_ADDRESS) ip from v$session where audsid = userenv(sessionid)) loop IF recIP = ? AND recUSERNAME = HR AND upper(recprogram) in (MSACCESSEXESQLPLUSWEXEJREWEXEMSEXCELEXE) THEN EXIT ELSIF upper(recprogram) in (MSACCESSEXESQLPLUSWEXEJREWEXEMSEXCELEXE) THEN raise_application_error(Access Deny) END IF END LOOP END 只有HR并且由指定的IP 才能使用ACCESS或者SQL*PLUS或者EXCEL连上来其他的使用者皆无法连线 但是拥有DBA OR SYSDBA ROLE的权限帐号是不会受到此限制 EXAMPLE ) 很多时候我们需要写一个logon trigger来进行帐号登入的控管在Three tier 架构下大部分的程式可能都是由一个固定的帐号授与适当的权限经由AP Server连接到后端的Oracle资料库来进行一般操作 这个帐号的权限可能很大而你并不希望programer利用这个帐号进入资料库做一些测试动作因为这样就达不到有效权限控管的要求可是这个AP专用的帐号及密码可能是半公开的你如何防止这样的情况发生呢? 写一个logon trigger 也许是不错的主意 CREATE OR REPLACE TRIGGER LOGON_DB_TRIGGER AFTER LOGON ON DATABASE DECLARE IP VARCHAR() UNAME VARCHAR() BEGIN SELECT SYS_CONTEXT (USERENVIP_ADDRESS)USERNAME INTO IPUNAME FROM V$SESSION WHERE AUDSID=USERENV(SESSIONID) IF IP != ? AND UNAME = APPLE THEN RAISE_APPLICATION_ERROR(CONNECTIION REFUSED) END IF END 写好这个Trigger只要使用者帐号为apple且来源IP不是都会被拒绝连线掉喔!!这样是不是多了些安全管控呢?特别注意一点如果欲受限制的帐号权限为DBA or SYSDBA者将不受此Trigger管制 |