登录触发器中(或过程中)获得当前会话的id v$mystat

如何在登录触发器中获得当前会话的id???  
   
  1.登录触发器中使用UserEnv('SESSIONID')出错  
  2.登录触发器中不能使用v$session,v$mystat,(用户甚至有dba权限阿)  
  3.只有当前用户名是不够的,因为同一个用户可能同时又多个连接。  
  4.如果采用Dbms_session.UNIQUE_SESSION_ID获得唯一序号,可如何和v$session中的当前会话记录对应起来,获得连接客户端的信息。  
   
  其实我的目的是,相为当前回话获得一个唯一标示,和当前连接客户端的信息,以便在以后的操作中使用。  
  谢谢各位关注   :)
触发器, session, 用户, 权限, 连接



---------------------------

create global temporary table usertype_temp2(SessionID integer,userid integer,  usertype integer) on Commit delete Rows ;
--方式一
insert into usertype_temp2  select sid,1,1 from v$mystat where rownum =1;
insert into usertype_temp2  select sid,2,2 from v$mystat where rownum =1;
insert into usertype_temp2  select sid,3,3 from v$mystat where rownum =1;

update usertype_temp2 set sessionid=(select sid from v$mystat where rownum =1)

--方式二 建立触发器

create or replace trigger usertype_temp2_t
before insert on usertype_temp2
for each row
begin
  select sid into :new.sessionid from v$mystat where rownum =1;
end;

--如果在建立触发器的时候提示找不到v$mystat 则是权限的问题
insert into usertype_temp2(userid,usertype) values(1,1);
insert into usertype_temp2(userid,usertype) values(2,2);
insert into usertype_temp2(userid,usertype) values(3,4);




--解决方案:

USER01@HUIYI>create or replace procedure t1 is
  2   l_sid number;
  3   l_serial number;
  4  begin
  5    select sid,serial# into l_sid,l_serial from sys.v_$session where audsid = userenv('sessionid');
  6    dbms_output.put_line(l_sid);
  7  end;
  8  /

警告: 建立的程序含有編譯錯誤.

USER01@HUIYI>show error
PROCEDURE T1 發生錯誤:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3      PL/SQL: SQL Statement ignored
5/51     PL/SQL: ORA-00942: 表格或視觀表不存在

SYS@HUIYI>grant select on sys.v_$session to user01;

順利授權.

USER01@HUIYI>create or replace procedure t1 is
  2    l_sid number;
  3    l_serial number;
  4  begin
  5    select sid,serial# into l_sid,l_serial from sys.v_$session where audsid = userenv('sessionid');
  6    dbms_output.put_line(l_sid);
  7  end;
  8  /

已建立程序.

USER01@HUIYI>exec t1();
11

PL/SQL 程序順利完成.

你可能感兴趣的:(oracle,触发器,v$mystat)