作者:壮壮由之妈_245 | 来源:互联网 | 2023-08-31 02:01
一个查询用户信息的触发器..建表: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 个解决方案
还有为什么当一个用户登陆后,他记录了两条一模一样的信息,有时候又记录一条信息呢?
举个例子:这里没有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;
/
实际上,在用户登录数据库时,他的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;
/
在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;
谢谢....
但为什么有时会返回两条一模一样的信息呢
有时又只有一条信息...
肯定不是?
是一个用户登陆了,会有两条一样的纪录
SYS用户登陆了有几十条纪录呢
会不会和ORACLE 内部的触发有关啊