create table sys.ddl_actions
(who varchar2(100),
what varchar2(2000),
when date,
ip_address varchar2(100),
terminal varchar2(100)
);
/
-------------------------------------------------------------------
CREATE OR REPLACE TRIGGER sys.LogDDLActions
BEFORE DDL ON DATABASE
DECLARE
executor ddl_actions.who%TYPE;
action ddl_actions.what%TYPE;
ipaddr ddl_actions.ip_address%TYPE;
tterminal ddl_actions.terminal%TYPE;
BEGIN
executor := LOGIN_USER;
action := SYSEVENT||' '||DICTIONARY_OBJ_TYPE||' '
||DICTIONARY_OBJ_OWNER||'.'||DICTIONARY_OBJ_NAME;
SELECT DISTINCT TRIM(SYS_CONTEXT('userenv','ip_address')), terminal INTO ipaddr, tterminal
FROM V_$SESSION
WHERE NVL(USERNAME,'NULL') = USER
AND TERMINAL = USERENV('TERMINAL');
INSERT INTO ddl_actions VALUES (executor, action, SYSDATE, ipaddr, tterminal);
EXCEPTION
WHEN OTHERS THEN
INSERT INTO ddl_actions VALUES (executor, action, SYSDATE, null, null);
END;
/