- SQL code
create or replace trigger login_on_infoafter 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;
此触发器记录用户的登录信息,编译的时候报错
Compilation errors for TRIGGER WATCHER.LOGIN_ON_INFO
Error: PL/SQL: ORA-00942: 表或视图不存在
Line: 6
Text: from sys.v_$session where AUDSID = USERENV('SESSIONID');
Error: PL/SQL: SQL Statement ignored
Line: 4
Text: insert into login_log(session_id,login_on_time,login_off_time,user_in_db,machine,ip_address,run_program)
网上查了一下,说是权限的问题需要给赋权限
grant select on sys.v_$session to username;
但是我不太清楚具体这句话应该如何放在语句里,请知道的前辈不吝赐教,拜谢O(∩_∩)O~
------解决方案--------------------
- SQL code
--你直接sys用户登入然后执行那个语句就可以了。--假设你建立触发器的用户是testgrant 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>
------解决方案--------------------