create table login_log -- 登入注销信息表
(
    session_id int not null, -- sessionid
    login_on_time  date, -- 登入时间
    login_off_time  date, -- 注销时间
    user_in_db varchar2(30), -- 登入的db user
    machine    varchar2(20),    -- 机器名
    ip_address varchar2(20), -- ip地址
    run_program varchar2(20)    -- 以何程序登入
);create table allow_user -- 网域用户表
(
    ip_address varchar2(20), -- ip地址
    login_user_name nvarchar2(20)   -- 操作者姓名
);create or replace trigger login_on_info -- 纪录登入信息的触发器
after logon on database 
Begin 
    insert into login_log(session_id,login_on_time,login_off_time,user_in_db,machine,ip_address,run_program)
    select AUDSID,sysdate,null,sys.login_user,machine,SYS_CONTEXT('USERENV','IP_ADDRESS'),program
    from v$session where AUDSID = USERENV('SESSIONID');  --当前SESSION
END;create or replace trigger login_off_info -- 纪录注销信息的触发器
before logoff on database 
Begin
update login_log set  login_off_time = sysdate
where session_id = USERENV('SESSIONID'); --当前SESSION
exception
    when others then
     null;
END;select l.ip_address,
login_user_name,
machine,
run_program,
to_char(login_on_time,'yyyy-mm-dd hh24:mi:ss') 
from login_log l,allow_user a
where l.ip_address=a.ip_address(+) 
order by login_on_time;

解决方案 »

  1.   

    IronPromises(铁诺):
    你好,首先谢谢你,但我在创建触发器时提示错误:
    after logon on database
          *
    错误位于第2行:
    ORA-04072: 无效的触发器类型用show error提示:没有错误。
    不知道是什么原因,还请帮忙。
    我的Oracle是 Oracle8 Release 8.0.5.0.0版的,是不是版本太低的原因还是其它?
      

  2.   

    after login on database
      

  3.   

    这是Oracle8i引入的新功能:数据库事件触发器。
    换句话说就是只能在Oracle8.15及其以上版本才能使用。
      

  4.   

    bluecetacean(蓝鲸) :写login是不对的!
    因为这个登入事件的名称是logon,而注销事件名称是logoff!
      

  5.   

    谢谢大家,我用的是Oracle8 Release 8.0.5.0.0,不能用logon或logoff,不知还有没有其它办法?
      

  6.   

    可不可以动态刷新SELECT V$SESSION.和V$PRESSES
      

  7.   

    V$SESSION有登陆时间,但怎么知道断开时间是比较难的。
    而且,有的session断开了(非正常),V$session还记录的有它的信息,
    这个你怎么处理。
      

  8.   

    如果又用不了触发器,还不能用审计,
    那可以用job吗。
    动态的检查v$session(每分钟一次),然后提炼你需要的信息
      

  9.   

    如果又用不了触发器,还不能用审计,
    那可以用job吗。
    动态的检查v$session(每分钟一次),然后提炼你需要的信息
      

  10.   

    小弟试了一下,启动了Session审记,在sys.aud$中可以看到连接时间和断开时间,不知在sys.aud$上做触发器有什么弊端,还请示下?
      

  11.   

    算了,sys.aud$表上好象不能创建触发器。既然天要绝我,我也没有办法,谢谢大家的支持与帮助,马上解帖。