Oracle登录信息的触发功能.下面的一段代码是在以前的一帖子上的 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(50) --以何程序登入 ); 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.LONG_USER,MACHINE,SYS_CONTEXT('USERENV','IP_ADDRESS'),PROGRAM FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID'); --当前的 SESSION END LOGIN_ON_INFO; --记录登出信息的触发器 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 WHERE OTHERS THEN NULL; END LOGIN_OFF_INFO; 现在从SQLPLUS中以SYSTEM的身份登录,该触发器怎么没有触发? 出现以下错误 ERROR: ORA-04098: 触发器 'SYS.LOGIN_OFF_INFO' 无效且未通过重新确认 ERROR: ORA-24315: 非法的属性类型 SYS.LONG_USER应改为SYS.LOGIN_USER 代码有错 SELECT AUDSID,SYSDATE,NULL,SYS.LONG_USER,MACHINE,SYS_CONTEXT SYS.LONG_USER应该为SYS.LOGIN_USERWHERE OTHERS THEN WHERE应为WHENAUDSID session号 SYS.LOGIN_USER中的SYS是表示SYS用户下的函数 SYS_CONTEXT('USERENV','IP_ADDRESS') 返回当前用户的ip地址 USERENV('SESSIONID') 当前session号 编译出现这样的错误 The following error has occurred:TRIGGER SYSTEM.LOGIN_ON_INFO On line: 4 PLS-00201: 必须说明标识符 'SYS.V_$SESSION' 下面的触发器的错误怎样修改? CREATE OR REPLACE TRIGGER DROP_INFO AFTER DROP ON DOCMAN.SCHEMA BEGIN INSERT INTO SYSTEM.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; The following error has occurred:
TRIGGER SYS.DROP_INFO On line: 12 PLS-00201: 必须说明标识符 'SYS.CONTEXT' 有趣的现象: 用SQLPLUSW登陆,LOGON_ON_TIME列有值,假如在SQLPLUSW中输入命令EXIT退出,LOGON_OFF_TIME列有值,假如点击右上方的*关闭,则LOGON_OFF_TIME列为空。(无论哪个用户)
|