Oracle10g Anmeldung überwachen

Hallo Experten,

kann mir einer sagen wie und ob es möglich ist, die Informationen die im View SYS.V_$SESSION (Public synonym V$SESSION) stehen automatisiert in eine Tabelle zu schreiben!

Bedeutet ich brauche jede Anmeldung (ev. Anmeldeversuch) in einer Tabelle, am besten mit Client, Programm, Login, Datum/Uhrzeit!

Ein Trigger auf den View geht ja nicht, denk ich zumindest!

Vieleicht hat ja einer ne Lösung?

Gruß Patrick

wurde gelöst!!!

:wink:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Patrick!

wurde gelöst!!!

kann mir einer sagen wie und ob es möglich ist, die
Informationen die im View SYS.V_$SESSION (Public synonym
V$SESSION) stehen automatisiert in eine Tabelle zu schreiben!

Es wäre nett, wenn du deine neuen Erkenntnisse der Allgemeinheit zugänglich machen würdest…

on-logon-Trigger?

Gruß
Martin

LÖSUNG: Oracle10g Anmeldung überwachen
Hi Martin, Hallo @all,

natürlich kann ich die Lösung veröffentlichen.

die ersten 3 Trigger protokolieren jede Datenbankänderung!
(habe ich abgeschrieben :wink: )
die letzten beiden wurden von mir angepasst, sie protokolieren
jede an- und abmeldung!!!

#Tabelle für Information
CREATE TABLE so.so_session_log
(ora_user VARCHAR2(100),
ora_time TIMESTAMP,
ora_sid VARCHAR2(100),
ora_objeto VARCHAR2(100),
ora_tipo VARCHAR2(100),
ora_sql CLOB,
ora_osuser VARCHAR2(200),
ora_machine VARCHAR2(200),
ora_oprogram VARCHAR2(200))
TABLESPACE USERS;

/
CREATE OR REPLACE TRIGGER so.so_session_alter
AFTER
ALTER
ON DATABASE
DECLARE
csql_text ora_name_list_t;
n NUMBER;
cSQL CLOB;
var_user varchar2(30);
var_osuser varchar2(30);
var_machine varchar2(64);
var_process varchar2(09);
var_program varchar2(48);
var_sqltext varchar2(1000);
BEGIN
select s.username, s.osuser, s.machine, s.program
into var_user, var_osuser, var_machine, var_program
from sys.v_$session s
,sys.v_$sqlarea t
where s.audsid = userenv(‚sessionid‘)
and s.prev_sql_addr = t.address(+)
and s.prev_hash_value = t.hash_value(+)
and username is not null;
n:= ora_sql_txt(csql_text);
FOR I IN 1…N LOOP
cSQL:=cSQL||csql_text(i);
END LOOP;
INSERT INTO so.so_session_log
(ora_user, ora_time, ora_sid, ora_objeto, ora_tipo,ora_SQL,
ora_OSUSER , ora_MACHINE , ora_OPROGRAM
)
VALUES(
‚A-‘||DBMS_STANDARD.LOGIN_USER, sysdate,
userenv(‚sessionid‘), DBMS_STANDARD.DICTIONARY_OBJ_NAME,
DBMS_STANDARD.dictionary_obj_type,cSQL,
var_osuser, var_machine, var_program
);
END;
/

– End of DDL Script for Trigger ADM.TGR_ALTER

– Start of DDL Script for Trigger ADM.TGR_CREATE
– Generated 04/05/2004 15:36:01 from ADM@xxxxxxxxxx

CREATE OR REPLACE TRIGGER so.so_session_create
AFTER
CREATE
ON DATABASE
DECLARE
csql_text ora_name_list_t;
n NUMBER;
cSQL CLOB;
var_user varchar2(30);
var_osuser varchar2(30);
var_machine varchar2(64);
var_process varchar2(09);
var_program varchar2(48);
var_sqltext varchar2(1000);
BEGIN
select s.username, s.osuser, s.machine, s.program
into var_user, var_osuser, var_machine, var_program
from sys.v_$session s
,sys.v_$sqlarea t
where s.audsid = userenv(‚sessionid‘)
and s.prev_sql_addr = t.address(+)
and s.prev_hash_value = t.hash_value(+)
and username is not null;
n:= ora_sql_txt(csql_text);
FOR I IN 1…N LOOP
cSQL:=cSQL||csql_text(i);
END LOOP;
INSERT INTO so.so_session_log
(ora_user, ora_time, ora_sid, ora_objeto, ora_tipo,ora_SQL,
ora_OSUSER , ora_MACHINE , ora_OPROGRAM
)
VALUES(
‚C-‘||DBMS_STANDARD.LOGIN_USER, sysdate,
userenv(‚sessionid‘), DBMS_STANDARD.DICTIONARY_OBJ_NAME,
DBMS_STANDARD.dictionary_obj_type,cSQL,
var_osuser, var_machine, var_program
);
END;
/

– End of DDL Script for Trigger ADM.TGR_CREATE

– Start of DDL Script for Trigger ADM.TGR_DROP
– Generated 04/05/2004 15:36:04 from ADM@xxxxxxxxxx

CREATE OR REPLACE TRIGGER so.so_session_drop
AFTER
DROP
ON DATABASE
DECLARE
csql_text ora_name_list_t;
n NUMBER;
cSQL CLOB;
var_user varchar2(30);
var_osuser varchar2(30);
var_machine varchar2(64);
var_process varchar2(09);
var_program varchar2(48);
var_sqltext varchar2(1000);
BEGIN
select s.username, s.osuser, s.machine, s.program
into var_user, var_osuser, var_machine, var_program
from sys.v_$session s
,sys.v_$sqlarea t
where s.audsid = userenv(‚sessionid‘)
and s.prev_sql_addr = t.address(+)
and s.prev_hash_value = t.hash_value(+)
and username is not null;
n:= ora_sql_txt(csql_text);
FOR I IN 1…N LOOP
cSQL:=cSQL||csql_text(i);
END LOOP;
INSERT INTO so.so_session_log
(ora_user, ora_time, ora_sid, ora_objeto, ora_tipo,ora_SQL,
ora_OSUSER , ora_MACHINE , ora_OPROGRAM
)
VALUES(
‚D-‘||DBMS_STANDARD.LOGIN_USER, sysdate,
userenv(‚sessionid‘), DBMS_STANDARD.DICTIONARY_OBJ_NAME,
DBMS_STANDARD.dictionary_obj_type,cSQL,
var_osuser, var_machine, var_program
);
END;
/

CREATE OR REPLACE TRIGGER so.so_session_logon
AFTER
lOGON
ON DATABASE
DECLARE
csql_text ora_name_list_t;
n NUMBER;
cSQL CLOB;
var_user varchar2(30);
var_osuser varchar2(30);
var_machine varchar2(64);
var_process varchar2(09);
var_program varchar2(48);
var_sqltext varchar2(1000);
BEGIN
select s.username, s.osuser, s.machine, s.program
into var_user, var_osuser, var_machine, var_program
from sys.v_$session s
where s.audsid = userenv(‚sessionid‘)
and username is not null;

INSERT INTO so.so_session_log
(ora_user, ora_time, ora_sid, ora_objeto, ora_tipo,ora_SQL,
ora_OSUSER , ora_MACHINE , ora_OPROGRAM
)
VALUES(
DBMS_STANDARD.LOGIN_USER, sysdate,
userenv(‚sessionid‘), ‚CONNECT‘,
DBMS_STANDARD.dictionary_obj_type, ‚‘,
var_osuser, var_machine, var_program
);
END;
/

CREATE OR REPLACE TRIGGER so.so_session_logoff
before
lOGOFF
ON DATABASE
DECLARE
csql_text ora_name_list_t;
n NUMBER;
cSQL CLOB;
var_user varchar2(30);
var_osuser varchar2(30);
var_machine varchar2(64);
var_process varchar2(09);
var_program varchar2(48);
var_sqltext varchar2(1000);
BEGIN
select s.username, s.osuser, s.machine, s.program
into var_user, var_osuser, var_machine, var_program
from sys.v_$session s
where s.audsid = userenv(‚sessionid‘)
and username is not null;
INSERT INTO so.so_session_log
(ora_user, ora_time, ora_sid, ora_objeto, ora_tipo,ora_SQL,
ora_OSUSER , ora_MACHINE , ora_OPROGRAM
)
VALUES(
DBMS_STANDARD.LOGIN_USER, sysdate,
userenv(‚sessionid‘), ‚DISCONNECT‘,
DBMS_STANDARD.dictionary_obj_type, ‚‘,
var_osuser, var_machine, var_program
);
END;
/

Hallo Patrick

natürlich kann ich die Lösung veröffentlichen.

die ersten 3 Trigger protokolieren jede Datenbankänderung!
(habe ich abgeschrieben :wink: )
die letzten beiden wurden von mir angepasst, sie protokolieren
jede an- und abmeldung!!!

Danke. Dir fehlt allerdings der Eintrag von ungültigen Logon-Versuchen. Kriegst du damit:

CREATE TRIGGER log\_errors AFTER SERVERERROR ON DATABASE 
BEGIN
 IF (IS\_SERVERERROR (1017)) THEN
 [dein Code]
 END IF;
END;

Allerdings kannst du da mW nicht viel mehr loggen, als dass es eben passiert ist, Hintergrundinfos wie IP o.ä. bleiben dir da verborgen.

Gruß
Martin

Hi Martin,

vielen Dank, werde ich noch einbauen!

Gruß Patrick

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Martin,

es gibt doch eine Lösung zum loggen der IP/User usw.

AUTID_TRAIL=DB or TRUE

AUDIT session BY ACCESS WHENEVER NOT SUCCESSFUL;
das Ergebins steht dann in

SELECT * FROM dba_audit_session;
incl. OS_USER,HOSTNAME,DATE,USER, SESSION

über das AUDIT kann auch alles andere Konfiguriert werden!

Gruß Patrick

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Hallo Patrick!

Natürlich, der Audit *aufdieStirnhau*. Gibt ein Sternchen :wink:

Gruß
Martin

Hi ihr Beiden!

Natürlich, der Audit

Der einem aufgrund der ständigen Anwendung doch einfallen müßte :wink:

*aufdieStirnhau*.

mir bitte auch … einem OCP* darf sowas nicht passieren :smile:

Grüße,
Tomh

*Der Grund warum ich wochenlang nix mehr von Oracle wissen wollte - ich war schon soweit, das „Hochfahren“ der Kaffemaschine tunen zu wollen …