在Oracle中,怎么捕获用户登录信息,如SID,IP地址等?
答案:可以利用登录触发器,如:
CREATE OR REPLACE TRIGGER TR_LOGIN_RECORD
AFTER LOGON ON DATABASE
DECLARE
MIUSERSID NUMBER;
MTSESSION V$SESSION%ROWTYPE;
CURSOR CSESSION(IIUSERSID IN NUMBER) IS
SELECT * FROM V$SESSION
WHERE SID=IIUSERSID;
BEGIN
SELECT SID INTO MIUSERSID FROM V$MYSTAT WHERE ROWNUM<=1;
OPEN CSESSION(MIUSERSID);
FETCH CSESSION INTO MTSESSION;
--IF USER EXISTS THEN INSERT DATA
IF CSESSION%FOUND THEN
INSERT INTO LOG$INFORMATION(LOGIN_USER,LOGIN_TIME,IP_ADRESS,AUSID,TERMINAL,
OSUSER,MACHINE,PROGRAM,SID,SERIAL#)
VALUES(ORA_LOGIN_USER,SYSDATE,SYS_CONTEXT ('USERENV','IP_ADDRESS'),
USERENV('SESSIONID'),
MTSESSION.TERMINAL,MTSESSION.OSUSER,
MTSESSION.MACHINE,MTSESSION.PROGRAM,
MTSESSION.SID,MTSESSION.SERIAL#);
ELSE
--IF USER DON'T EXISTS THEN RETURN ERROR
SP_WRITE_LOG('SESSION INFORMATION ERROR:'||SQLERRM);
CLOSE CSESSION;
RAISE_APPLICATION_ERROR(-20099,'LOGIN EXCEPTION',FALSE);
END IF;
CLOSE CSESSION;
EXCEPTION
WHEN OTHERS THEN
SP_WRITE_LOG('LOGIN TRIGGER ERROR:'||SQLERRM);
END TR_LOGIN_RECORD;
在以上触发器中需要注意以下几点:
1、该用户有V_$SESSION与V_$MYSTAT的对象查询权限,可以在SYS下对该拥护显式授权。
2、SP_WRITE_LOG是一个记录日志的存储过程,可以根据自己的需要进行调整。
3、必须在创建该触发器之前创建一个LOG$INFORMATION的表记录登录信息。
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:230161599
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。




