登录触发器中(或过程中)获得当前会话的id v$mystat
如何在登录触发器中获得当前会话的id
www.2cto.com
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 程序 利完成.