Вы здесь

Триггер на событие logon

В некоторых случаях, например, когда к базе подключается приложение, возникает необходимость снимать трассировку сессии с самого начала, и нет возможности ни включить трассировку из этой сессии, ни из другой, как описано здесь. Тогда решением будет создание триггера на событие Logon:

CREATE OR REPLACE TRIGGER sys.logon_trace_trigger
	AFTER LOGON ON cube.SCHEMA
DECLARE
	s1 NUMBER;
	s2 NUMBER;
	os VARCHAR2(256);
BEGIN
	SELECT 
		TO_NUMBER(TO_CHAR(sid)) sid,
		TO_NUMBER(TO_CHAR(DECODE(SIGN(serial#), 
			-1, 
			65536 + serial#, 
			serial# ))) ser#, 
		osuser
	INTO s1, s2, os
	FROM sys.v_$session
	WHERE TYPE != 'BACKGROUND'
		AND audsid = USERENV('sessionid')
		AND ROWNUM = 1
		AND ( ADDITIONAL_CONDITIONS );
 
	EXECUTE IMMEDIATE 'ALTER SESSION SET TRACEFILE_IDENTIFIER=my_trig_trace';
	SYS.DBMS_SYSTEM.SET_EV(s1, s2, 10046, 12, '');
 
	EXCEPTION WHEN OTHERS THEN NULL;
END;
/

Выражение AFTER LOGON ON cube.SCHEMA означает, что триггер будет работать только для сессий, подключающихся к схеме cube.
Вместо ADDITIONAL_CONDITIONS можно добавить дополнительные условия, например, для фильтрации сессии по osuer'у, терминалу, имени программного модуля, etc.
'ALTER SESSION SET TRACEFILE_IDENTIFIER=my_trig_trace'; нужно для того, чтобы было удобно найти trace-файлы, в их имени будет содержаться строка "MY_TRIG_TRACE"

Когда трассировки получены, триггер больше не нужен:

-- Деактивируем триггер, вдруг понадобится...
ALTER TRIGGER sys.logon_trace_trigger DISABLE;
-- Не понадобился
DROP TRIGGER sys.logon_trace_trigger;
select * from dba_objects where OBJECT_TYPE like '%TRIG%' and OBJECT_NAME like '%LOG%';
 select * from dba_objects where OBJECT_TYPE like '%TRIG%' and OBJECT_NAME='LOGON_VERIFY';
 
declare 
  vText LONG;
begin
  select t.trigger_body INTO vText
  from user_triggers t 
  WHERE t.trigger_name = upper('LOGON_VERIFY');
  DBMS_OUTPUT.put_line(vText);
end;
 
 
DECLARE
    v_sid_serial VARCHAR2(64);
    v_in         NUMBER;
    v_sid        NUMBER;
  BEGIN
    v_in:=0;
    SELECT 1
    INTO v_in
    FROM v$session
    WHERE AUDSID        = SYS_CONTEXT('USERENV','SESSIONID')
    AND username       IN ('SIEBEL','SADMIN')
    and REGEXP_LIKE(MACHINE,'.*((sblprdapp5|msk-15-62m0245|msk-och-100726|msk-och-101113|msk-och-100793|msk-och-101125|msk-mat-01996|msk-och-100733|msk-mat-03089|msk-62m3742|msk-och-100731|msk-och-101112|msk-och-100796|msk-och-00308|sblprdadm|sblprdapp6|sblprdapp7|sblprdapp8|sblprdapp9|sblprdapp10|msk-mat-04295|mkobzev|dfedotov-note|mgrinevich-new|dvf|imelnikov|mts-mon-dkb|anovikov|mtshelp|rchuchvaga|sblprdapp1|sblprdbi|bak410-1|sblprdapp2|sblprdapp3|sblprdapp4|siebel-db1|dgolovanov|pdobrogurskij|aglodov|GNikolaeva2|iovseenko|anovikov|siebel-db|sblprdgw)+).*','i');
    IF v_in             = 1 THEN
      NULL;
    END IF;
    EXCEPTION
     WHEN     NO_DATA_FOUND     THEN
          RAISE_APPLICATION_ERROR(-20001, 'MTSBANK: Exception trigger for LOGON.');
     WHEN     OTHERS THEN
          NULL;
  END;
 
tst> column client_ip format a20
tst> column server_ip format a20
tst> select sys_context('USERENV', 'IP_ADDRESS') client_ip,
  2         utl_inaddr.get_host_address(machine) server_ip
  3  from v$session where sid=1 /* Нужно только для server_ip */
  4  /
 
CLIENT_IP            SERVER_IP
-------------------- --------------------
192.168.1.169        192.168.1.201
 
 
 
 set long 5000;
select TRIGGER_NAME,TRIGGER_BODY from user_triggers where TRIGGER_NAME='LOGON_VERIFY';
 
 set long 5000;
select TRIGGER_NAME,TRIGGER_BODY from user_triggers where TRIGGER_NAME=upper('tbs_amldata_days_left');
 
tbs_amldata_days_left         

Post new comment

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
11 + 7 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.