2016-04-05 11 views
1

首先,我想要做的是写一个触发器,它会在日志表如下 -如何在Oracle中编写一个触发器来记录信息是否有CREATE,DROP,ALTER,UPDATE,DELETE被执行?

username 
modification (like - CREATE ALTER DROP UPDATE DELETE) 
datetime (when it happend) 

如果任一下列的事情发生了 - 创建ALTER DROP,更新,删除,然后触发将记录的信息。

它甚至有可能这样做吗?

我想出了表级触发器,它将为特定表的INSERT UPDATE DELETE执行。

但是,我确实需要模式级别的所有对象。

如果没有,至少对于任何表。

回答

2

这适用于Oracle 11g。我不记得我从哪里得到它

CREATE OR REPLACE TRIGGER <YourSchema>.audit_ddl_trg 
    AFTER DDL 
    ON SCHEMA 
BEGIN 
    IF (ora_sysevent = 'TRUNCATE') 
    THEN 
     NULL;         -- I do not care about truncate 
    ELSE 
     INSERT INTO <YourSchema>.audit_ddl (d, 
            osuser, 
            current_user, 
            HOST, 
            terminal, 
            owner, 
            TYPE, 
            name, 
            sysevent) 
     VALUES (SYSDATE, 
        SYS_CONTEXT ('USERENV', 'OS_USER'), 
        SYS_CONTEXT ('USERENV', 'CURRENT_USER'), 
        SYS_CONTEXT ('USERENV', 'HOST'), 
        SYS_CONTEXT ('USERENV', 'TERMINAL'), 
        ora_dict_obj_owner, 
        ora_dict_obj_type, 
        ora_dict_obj_name, 
        ora_sysevent); 
    END IF; 
END; 
+0

请记住,如果声明ON SCHEMA,只有当某人以模式执行DDL登录时才会触发。要获取模式中的所有操作,您需要将其声明为ON DATABASE,然后检查DDL目标的模式是否正确。有关讨论在这里:http://stackoverflow.com/questions/1640317/oracle-trigger-on-schema-not-being-triggered-by-other-users-besides-the-schema-o –

+0

这是真棒,但对于UPDATE或DELETE它不起作用。我需要记录所有这些事件-CREATE ALTER DROP UPDATE DELETE –

+0

对于像这样的DML语句,您应该使用审计功能,因为它可以让您按对象记录这些操作。为什么不问另一个关于Oracle审计或搜索的问题? – kevinsky

相关问题