可以这样做,用sys加一个logon on database的事件触发器,在其中判断是否你的应用程序连接的数据库,如果是,就启动跟踪,否则不跟踪。
create or replace trigger login_on_info
after logon on database
declare
  v_serial int;
  v_user   int;
  v_sid    int;
Begin
  if USERENV('SESSIONID')>0 then
    begin
      select sid,serial#,user# into v_sid,v_serial,v_user from v$session where audsid=userenv('sessionid');
      if v_user=41 then --此处是判断用户ID是41就跟踪
        dbms_system.set_sql_trace_in_session(v_sid,v_serial, TRUE);
      end if;
    exception when others then null;
    end;
  end if;
END;
/

解决方案 »

  1.   

    我把你写的这段代码用sql/plus在sys下加入.编译是没有错误的.但是当我把程序起来之后,trc文件中就出现了错误的信息.如下:
    *** SERVICE NAME:(tgas) 2005-09-20 15:22:35.953
    *** SESSION ID:(137.1273) 2005-09-20 15:22:35.953
    Skipped error 4098 during the execution of TGAS.LOGIN_ON_INFO 
    *** 2005-09-20 15:22:36.000
    ksedmp: internal or fatal error
    ORA-04098: trigger 'TGAS.LOGIN_ON_INFO' is invalid and failed re-validation
    但是不影响程序的运行,请问是怎么回事?
    谢谢.
      

  2.   

    奇怪了,我在我的机器上没有这样的信息。你查看的这个trc文件是udump下的吗?如果将trigger禁止,是否还生成trc文件?系统参数sql_trace是否被设置为true了?
      

  3.   

    现在不出错了,但是访问数据库的时候,在udump下面不生成trc文件了,还需要在其他地方设置什么参数吗?
    现在的sql_trace是false.
      

  4.   

    需要这样处理吗?当你执行alter session set sql_trace true,udump就生成了trc文件,你用tkprof打开看不就可以了吗?
    如果用sys加一个logon on database的事件触发器,那不是一直在执行trace吗?trace是比较消耗资源的,肯定只有在定位问题时打开啊.