日期:2014-05-17  浏览次数:21140 次

oracle触发器里如何显式的赋权限
SQL code

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;


此触发器记录用户的登录信息,编译的时候报错
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用户登入然后执行那个语句就可以了。
--假设你建立触发器的用户是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>

------解决方案--------------------
探讨
2楼的兄弟 这句话应该放在整个SQL语句的什么位置啊 我刚才是这么放的,如下: