日期:2014-05-17 浏览次数:21327 次
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 sys.v_$session where AUDSID = USERENV('SESSIONID');
END;
--你直接sys用户登入然后执行那个语句就可以了。
--假设你建立触发器的用户是test
grant select any dictionary to test;
grant select on v_$session to test;
--我在test用户下测试了一下,没有报错。
[TEST@myorcl] SQL>CREATE TABLE LOGIN_LOG(
2 SESSION_ID VARCHAR2(20),
3 LOGIN_ON_TIME DATE,
4 LOGIN_OFF_TIME DATE,
5 USER_IN_DB VARCHAR2(20),
6 MACHINE VARCHAR2(20),
7 IP_ADDRESS VARCHAR2(20),
8 RUN_PROGRAM VARCHAR2(20)
9 );
表已创建。
[TEST@myorcl] SQL>CREATE OR REPLACE TRIGGER LOGIN_ON_INFO
2 AFTER LOGON ON DATABASE
3 BEGIN
4 INSERT INTO LOGIN_LOG
5 (SESSION_ID,
6 LOGIN_ON_TIME,
7 LOGIN_OFF_TIME,
8 USER_IN_DB,
9 MACHINE,
10 IP_ADDRESS,
11 RUN_PROGRAM)
12 SELECT AUDSID,
13 SYSDATE,
14 NULL,
15 SYS.LOGIN_USER,
16 MACHINE,
17 SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
18 PROGRAM
19 FROM SYS.V_$SESSION
20 WHERE AUDSID = USERENV('SESSIONID');
21 END;
22 /
触发器已创建
[TEST@myorcl] SQL>
------解决方案--------------------