(ref:http://tolywang.itpub.net/post/48/380276)
以一個例子來說明logon trigger的使用問題。
1、問題提出
如下只是一個舉例,自己修改一下可以完成更多的功能。想完成如下的功能:
<1>某一個Ip段的用戶不能登陸
<2>針對的只是某一個或幾個用戶
<3>對連接所用的應用程式也進行了限定。
2、問題解決
<1>如果你的logon trigger不是建在sys用戶下,v_$session的查詢許可權需要授權給給建trigger的用戶。
我選擇在system用戶下建:
SQL>connect / as sysdba;
SQL>grant select on v_$session to system;
<2>logon trigger體
CREATE OR REPLACE TRIGGER QIUYB$LOGON AFTER
LOGON ON DATABASE
DECLARE
V_PROGRAM VARCHAR2(48);
V_MESSAGE VARCHAR2(1000);
V_BAD_LOGON EXCEPTION;
BEGIN
SELECT PROGRAM INTO V_PROGRAM
FROM V$SESSION
WHERE AUDSID = SYS_CONTEXT('USERENV', 'SESSIONID')
AND rownum<2;
IF USER IN ('QIUYB','HR')
AND sys_context('USERENV','ip_address') LIKE '10.199.168.%'
AND sys_context('USERENV','ip_address') LIKE '10.199.173.%'
AND lower(v_program)<>'zhyz_report.exe'
THEN
raise V_BAD_LOGON;
END IF;
EXCEPTION
WHEN v_bad_logon THEN
v_message := 'Uh Uh Uh! - This user can not logon with this software!!';
RAISE_APPLICATION_ERROR(-20002, v_message);
WHEN OTHERS THEN
v_message := 'FATAL ERROR - QIUYB$LOGON TRIGGER- Please Contact Your DBA!!' ||
CHR(10) || SQLERRM;
RAISE_APPLICATION_ERROR(-20003, v_message);
END;
3、特別說明
logon trigger對於dba許可權的用戶是沒效力的,只會在alter.log中生成報錯資訊。