热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

帮忙解决一个疑问,顶大家顶一下(给分)...

一个查询用户信息的触发器..建表:createtableLOG$INFORMATION(USERNAMEVARCHAR2(30),LOGINTIMEDATE,
一个查询用户信息的触发器..

建表:
create table LOG$INFORMATION
(
  USERNAME  VARCHAR2(30),
  LOGINTIME DATE,
  IPADRESS  VARCHAR2(20),
  MACHINE   VARCHAR2(64),
  PROGRAM   VARCHAR2(64),
);


这个是触发器:
create or replace trigger TR_LOGIN_RECORD
  after logon on database  
declare
   mtSession v$session%ROWTYPE; 
   CURSOR cSession(iiQuerySid IN NUMBER) IS 
    SELECT * FROM sys.v$session
     WHERE audsid = iiQuerySid; -- local variables here
begin
   OPEN cSession(userenv('SESSIONID')); 
   FETCH cSession INTO mtSession; 
   IF cSession%FOUND THEN 
 INSERT INTO log$information(username,logintime,ipadress,machine, program) 
        VALUES(USER,SYSDATE, SYS_CONTEXT ('USERENV','IP_ADDRESS'), 
          mtSession.MACHINE ,mtSession.Program);
   END IF; 
   CLOSE cSession; 
END;


如果要知道用户退出数据库的时间,请问该怎么写?
好象v$session,v$process,v$mydata里好象都没有这个记录,
可以的话,帮忙该下,谢谢!

13 个解决方案

#1


学习!

#2


学习

#3


学习

#4


还有为什么当一个用户登陆后,他记录了两条一模一样的信息,有时候又记录一条信息呢?

#5


UP

#6


学习

#7


晕死。。。
大家来讨论下总可以吧
怎么都UP阿?

#8


举个例子:这里没有IPADRESS   MACHINE    PROGRAM。
 
Create table Log_table(
Log_usr varchar2(30);
Database_name varchar2(30);
Event_name varchar2(30);
Log_time Date
);
/

用户登录时:
Create or replace trigger user_logon
AFTER LOGON ON DATABASE
BEGIN
    INSERT INTO LOG_TABLE(Log_usr, database_name, event_name, log_time)
      values(sys.login_user, 
             sys.database_name,
             sys.sysevent,
             sysdate);
END;
/
用户退出时时:
Create or replace trigger user_logon
BEFORE LOGOFF ON DATABASE
BEGIN
    INSERT INTO LOG_TABLE(Log_usr, database_name, event_name, log_time)
      values(sys.login_user, 
             sys.database_name,
             sys.sysevent,
             sysdate);
END;
/

#9


实际上,在用户登录数据库时,他的USERNAME、 IPADRESS、MACHINE、PROGRAM已记录在你的表LOG$INFORMATION中,在用户退出时,你只需记录他退出的时间即可(在你的表中加一退出时间LOGOUTTIME DATE):用以下触发器:

Create or replace trigger user_logon
BEFORE LOGOFF ON DATABASE
BEGIN
    UPDATE LOG$INFORMATION SET LOGOUTTIME = SYSDATE WHERE USERNAME = sys.login_user;
    COMMIT;
END;
/

#10


在8i以上版本可以使用系統觸發器來監控數據庫的登陸登出情況

[轉貼](已經忘記是民位打俠寫的樂)
監控登入登出的用戶
用以下的方式可以監控登入登出的用戶:
創建如下的兩張表:
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;

方法二:
用如下的方式可以審計執行drop動作的事件:
/**
 * drop語句的審計日誌表
 */
create table drop_log
(
    session_id int not null,  -- sessionid
    drop_time  date,  -- drop的時間
    ip_address varchar2(20),  -- ip地址
    object_owner varchar2(30),  -- 對象的擁有者
    object_name varchar2(30),  -- 對象名稱
    object_type varchar2(20),  -- 對象類型
    drop_by_user varchar2(30) -- 執行drop語句的用戶
);

create or replace trigger drop_info 
after drop on mfg0513user.schema  -- 在mfg0513user用戶上創建審計drop的觸發器
begin 
    insert into drop_log
     (session_id,
     drop_time,
     ip_address,
     object_owner,
     object_name,
     object_type,
     drop_by_user)
     values(USERENV('SESSIONID'),
     sysdate,
     SYS_CONTEXT('USERENV','IP_ADDRESS'),
     sys.dictionary_obj_owner,
     sys.dictionary_obj_name,
     sys.dictionary_obj_type,
     sys.login_user);    
end;

#11


谢谢....
但为什么有时会返回两条一模一样的信息呢
有时又只有一条信息...

#12


重復登陸?

#13


肯定不是?
是一个用户登陆了,会有两条一样的纪录
SYS用户登陆了有几十条纪录呢
会不会和ORACLE 内部的触发有关啊

推荐阅读
author-avatar
壮壮由之妈_245
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有