我们的数据库中有一个表最近莫名其妙的丢失部分数据。
  所以我想建个触发器,删除时将数据插入到另一个表中记录下,同时想把操作人的机器名,使用的程序名记录上。
 
  但我无法得到操作人的机器名和使用的程序名,我看V$session中有machine(或者terminal),program列,但只能查询出所有的会话的信息,无法找到当前会话的特征,所以无法定位到当前用户。  大家帮忙看看,有办法得到当前操作人的机器名和程序名么?

解决方案 »

  1.   

    查当前会话:
    select * from v$session where audsid=userenv('sessionid');
      

  2.   

    谢谢楼上
    这语句确实可以查出来,但我加在触发器里,提示:PLS-00201: 必须说明标识符 'SYS.V_$SESSION'楼上的帮人帮到底,看看是什么问题,怎么解决下。
      

  3.   

    hyee      2008年12月29日 15点51分44秒 说:
        你必须有sys用户权限,并且用sys用户授权,那个触发器才能编译通过taoether      2008年12月29日 15点58分58秒 说:
        只要这个用户有这个权限就可以,是这样么hyee      2008年12月29日 15点55分55秒 说:
        是的,你的触发器没有问题,缺少的是权限taoether      2008年12月29日 16点02分51秒 说:
        但为什么用户登录后,可以查询V$session这个表呢,搞不明白奇怪啊,怎么办呢
      

  4.   

    给你一篇以前的帖子。比你这复杂的多
    http://topic.csdn.net/u/20081021/12/89e62efa-cd83-4170-b8e7-109593631a51.html
      

  5.   

    触发器和存储过程在编译的时候,是以definer的身份编译的。definer在编译或执行一条SQL时,如果一个表或视图不属于它本身,并且没有授权给它自己或者public对象,那么不通过,它不检索通过它所属的role所拥有的权限(见表dba_tab_privs)。而在sql*plus执行select时,是以invoker(调用者)身份查询的,它除了检索一个表是否授权给自己或PUBLIC用户外,还检索当前会话的用户所属的role是否具备操作该表的权限。
    比如有视图V_$SQL_BIND_CAPTURE,它授予SELECT权限给SELECT_CATALOG_ROLE这个角色,然后SELECT_CATALOG_ROLE这个角色有通过间接方式授权给拥有DBA角色的用户(假设为CX)。CX在编译它自己存储过程时,如果碰到一条调用V_$SQL_BIND_CAPTURE视图的静态SQL,这时它编译不过去,因为在编译时,它不会检查DBA这个ROLE是否拥有读V_$SQL_BIND_CAPTURE的权限,而仅仅检查CX和PUBLIC这两个用户。所以,你的触发器有两种解决方式:
    第一种就像我刚才所说,将v_$session的读权限授权给它自己或者public用户
    另一种,写动态sql,并且动态sql的环境是current_user举个例子:--authid current_user
    create or replace function xxx return INT AUTHID CURRENT_USER IS 
       x INT;
    BEGIN
      EXECUTE IMMEDIATE 'SELECT 1 FROM v$sql_bind_capture WHERE ROWNUM=1' INTO x;     
      RETURN x;
    END;  
    /
    SQL> select xxx from dual;
     
           XXX
    ----------
             1
    --authid definer
    create or replace function xxx return INT  IS 
       x INT;
    BEGIN
      EXECUTE IMMEDIATE 'SELECT 1 FROM v$sql_bind_capture WHERE ROWNUM=1' INTO x;     
      RETURN x;
    END;  

    SQL> select xxx from dual;
     
    select xxx from dual
     
    ORA-00942: 表或视图不存在
    ORA-06512: 在 "DBO.XXX", line 4
      

  6.   

    http://topic.csdn.net/u/20081229/15/B4D10400-6E72-4C83-B2C5-60B0C0B5B377.html
    /*这贴的5楼4不4正解*/