Tuesday, August 7, 2012
Email Notification ddl audit trigger
-----------------------------------------------------------------------------------------------------------------------
connect sys as sysdba user and run two scripts for install and configure utl_mail package
SQL> conn sys@orcl as sysdba
Enter password: ******
Connected.
SQL> @d:\oracle\product\10.2.0\db_1\rdbms\admin\utlmail.sql
Package created.
Synonym created.
SQL> @d:\oracle\product\10.2.0\db_1\rdbms\admin\prvtmail.plb;
Package body created.
No errors.
Set SMTP_OUT_SERVER parameter for smtp_exchange_server. This parameter is not modifiable means we have to bounce our database to set this parameter
SQL> alter system set smtp_out_server = 'mail.apexsoftcell.com' scope=spfile;
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
Grant EXECUTE privs to user which use utl_mail package.
SQL> grant execute on utl_mail to ldbo;
Grant succeeded.
------------------------------------------------------------------------------------------
DROP TABLE ddl_events;
CREATE TABLE ddl_events
( eventId NUMBER(10,0),
eventDate DATE,
oraLoginUser VARCHAR2(30),
oraDictObjName VARCHAR2(30),
oraDictObjOwner VARCHAR2(30),
oraDictObjType VARCHAR2(30),
oraSysEvent VARCHAR2(30),
machine VARCHAR2(64),
program VARCHAR2(64),
osuser VARCHAR2(30),
ip_address VARCHAR2(20));
DROP TABLE ddl_events_sql;
CREATE TABLE ddl_events_sql
( eventId NUMBER(10,0),
sqlLine NUMBER(10,0),
sqlText VARCHAR2(4000) );
-----Sequence to support events id's:
DROP SEQUENCE dsq_ddlEvents;
CREATE SEQUENCE dsq_ddlEvents START WITH 1000;
-------and here is trigger code:
CREATE OR REPLACE TRIGGER dtr_ddlEvents
AFTER DDL ON DATABASE
DECLARE
l_sqlText ORA_NAME_LIST_T;
BEGIN
IF ORA_DICT_OBJ_OWNER in ('LDBO')
THEN
BEGIN
utl_mail.send (
sender => 'kshitij@apexsoftcell.com',
recipients => 'kshitij@apexsoftcell.com',
subject => 'DDL change has been made in '||ORA_DATABASE_NAME||' database.',
message => 'User '||ORA_LOGIN_USER||' had run '||ORA_SYSEVENT|| ' on '||ORA_DICT_OBJ_TYPE||' '||ORA_DICT_OBJ_OWNER||'.'||ORA_DICT_OBJ_NAME||' in '||ORA_DATABASE_NAME||' database.'
);
END;
INSERT INTO ddl_events
( SELECT dsq_ddlEvents.NEXTVAL,
SYSDATE,
ORA_LOGIN_USER,
ORA_DICT_OBJ_NAME,
ORA_DICT_OBJ_OWNER,
ORA_DICT_OBJ_TYPE,
ORA_SYSEVENT,
machine,
program,
osuser,
SYS_CONTEXT('USERENV','IP_ADDRESS')
FROM SYS.DUAL,
SYS.V_$SESSION
WHERE SYS_CONTEXT('USERENV','SESSIONID' ) = audsid(+) );
FOR l IN 1..ORA_SQL_TXT(l_sqlText) LOOP
INSERT INTO ddl_events_sql
( eventId, sqlLine, sqlText )
VALUES
( dsq_ddlEvents.CURRVAL, l, l_sqlText(l) );
END LOOP;
END IF;
END;
/
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment