create or replace trigger tr_user_logon after logon on database
declare
v_username varchar2(30);
v_machine varchar2(64);
v_osuser varchar2(30);
v_logon_time date;
v_cnt number;
v_sess_cnt number;
v_proc_cnt number;
cursor cur_session is
select username, machine, osuser, logon_time
from v$session
where audsid = userenv('SESSIONID')
and username is not null
and username not in ('GBSMAN', 'GBSMGR', 'ACCTMAN', 'PDMAN', 'GBSPKG',
'GACPKG', 'GBSMIG', 'GBSTRAN', 'GBSDEBUG')
and username in
(select ltrim(rtrim(upper(user_name))) from gusermgr.gbs_user_tbl);
v_open_mode varchar2(20);
begin
if user<>'DGEXP' then
select count(*)
into v_cnt
from v$session
where audsid = userenv('SESSIONID')
and username is not null
and username not in ('SYS', 'SYSTEM', 'DBMGR');
if v_cnt > 0 then
select value_num
into v_proc_cnt
from gbs_parameter
where name = 'processes';
select count(*) into v_sess_cnt from v$session;
if v_sess_cnt >= v_proc_cnt then
raise_application_error(-20001,
'maximum number of processes (' ||
v_proc_cnt || ') exceeded');
end if;
end if;
open cur_session;
loop
fetch cur_session
into v_username, v_machine, v_osuser, v_logon_time;
exit when cur_session%NOTFOUND;
v_machine := rtrim(v_machine, chr(0));
insert into mon_logon_info
values
(v_username, v_machine, v_osuser, v_logon_time);
end loop;
close cur_session;
end if;
end;