如,我想对t_dept表进行监控,当insert update delete时我就把操作语句保存到日志中,我知道用trigger可以实现 create   or   replace   trigger   TableChange   after   insert or update or delete   on   t_dept 
   for   each   row  begin     sql = select sql_text from v$sqltext where 。怎么确定是某个用户刚才执行insert or update or delete取出执行的sql
    insert into log (ora_user,sql_content) values(user,sql); end TableChange;请问这个完整的怎么写,我只知道此方法应该能行的通。谢谢了!

解决方案 »

  1.   

    我认为有ip,host,和user 就基本上够了,不一定要sqltext,你看看一下语句来代替
    SELECT sys_context('USERENV','IP_ADDRESS'),SYS_CONTEXT('USERENV','HOST'),
    SYS_CONTEXT('USERENV','OS_USER')  FROM DUAL
      

  2.   

    想从v$sqltext里面得到sql的话,需要ADDRESS,HASH_VALUE,这两个值可以从v$session得到。但是怎么得到自己当前执行的这两个值,现在我也不是很确定。但是,我知道,你想保存全部的SQL的话,可以用数据库的监查。SQL的FGA监查。
    使用的包:DBMS_FGA
      

  3.   

    想了一个办法,从lock表里面,联系session表,可以得到这个ADDRESS,HASH_VALUE。
      

  4.   

    情况是这样的,有几个用户都可以操作数据库,现在要对这些帐号进行管理,也就是列出他们最近操作的sql看看是否符合规定。我现在通过
    select sql_text,LAST_LOAD_TIME from v$sql where COMMAND_TYPE=&COMMAND_TYPE order by  LAST_LOAD_TIME desc;
    就可以列出各种操作的sql语句和时间,但是没有用户的信息,怎么关联出sql是哪个用户执行的呢?
    还是必须要在触发器里才能得到user
      

  5.   

    得到SQL执行的用户?到 V$SESSION里面取.
      

  6.   

    sys_context('USERENV','SESSION_USER') 也可以呀。
      

  7.   

    我是要把sql_text和对应的user取出来,也就是哪个user执行过哪个sql_text。user和sql_text用什么关联的?
      

  8.   

    看是谁来操作dept表,使用trace来跟踪这个会话
      

  9.   

    通过sql_hash_value,sql_address在v$session和v$sqltext或者v$sqlarea
    做个测试就知道了,偷懒你就自己做吧,仅提供思路
      

  10.   

    通过v$session的sql_hash_value我做过,那永远得到的是当前的sql_text也就是查询v$session和v$sqltext的select语句,用trace跟踪是怎么搞得?没用过,能说一下吗?
      

  11.   

    通过v$session的sql_hash_value我做过,那永远得到的是当前的sql_text也就是查询v$session和v$sqltext的select语句,用trace跟踪是怎么搞得?没用过,能说一下吗?
      

  12.   

    ^_^不好意思,v$sqltext和v$sqlarea查询到的是共享池中的sql 
    那就麻烦点,看看有关statspack的脚本,看看oracle是怎么做的吧,不知道可行不
      

  13.   

    抱歉,说错了,每个session在v$session中保留一条记录,所以查询到的总是最后一条,所以用v$session是不对的
      

  14.   

    v$session中保留了两条纪录。最新的,和之前的一条。
      

  15.   

    〉我是要把sql_text和对应的user取出来,也就是哪个user执行过哪个sql_text。user和sql_text用什么关联的?v$SQL里面的PARSING_USER_ID,就是执行这个句子的用户ID,可以用dba_users里面找到这个用户。还有,因为你的事件是写在trigger里面的。
    select sys_context('USERENV','SESSION_USER') from dual;
    可以得到当前执行这个触发器的用户的。
      

  16.   

    现在不用这种方法了,而是把:old和:new都记录下来反映数据变化情况,这样似乎效果更好。
    谢谢大家的参与!!!!!!