如何在Oracle中编写触发器,在执行任何创建、删除、更改、更新和删除操作时记录信息?

如何在Oracle中编写触发器,在执行任何创建、删除、更改、更新和删除操作时记录信息?,oracle,triggers,Oracle,Triggers,首先,我想做的是编写一个触发器,它将在下面的表中记录- username modification (like - CREATE ALTER DROP UPDATE DELETE) datetime (when it happend) 如果发生以下任何情况-创建ALTER DROP UPDATE DELETE,那么触发器将记录信息 甚至有可能这样做吗 我提出了表级触发器,它将用于特定表的INSERT UPDATE DELETE 但,对于任何对象,我都需要在模式级别使用它们 如果没有,至少对于任

首先,我想做的是编写一个触发器,它将在下面的表中记录-

username
modification (like - CREATE ALTER DROP UPDATE DELETE)
datetime (when it happend)
如果发生以下任何情况-创建ALTER DROP UPDATE DELETE,那么触发器将记录信息

甚至有可能这样做吗

我提出了表级触发器,它将用于特定表的INSERT UPDATE DELETE

但,对于任何对象,我都需要在模式级别使用它们


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

这适用于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;
创建或替换触发器。审核\u ddl\u trg
DDL后
论图式
开始
IF(ora_sysevent='TRUNCATE')
然后
空;——我不在乎截断
其他的
插入到.audit_ddl(d,
奥瑟尔,
当前用户,
主办
终点站,
所有者,
类型,
名称
系统事件)
值(SYSDATE,
系统上下文('USERENV','OS\u USER'),
系统上下文(“USERENV”,“当前用户”),
系统上下文('USERENV','HOST'),
系统上下文('USERENV','TERMINAL'),
奥拉·迪克特·奥布吉的所有者,
ora_dict_obj_类型,
我的名字是什么,
ora_sysevent);
如果结束;
结束;

请记住,如果在架构上声明,则只有在架构执行DDL时有人登录时才会触发。要获取模式中的所有操作,需要在数据库中声明它,然后检查DDL目标的模式是否正确。这里有相关的讨论:这太棒了,但对于更新或删除来说,它不起作用。。我需要记录所有这些事件-创建alterdropupdatedeletefordml语句,就像您应该使用审计一样,因为它允许您逐个对象记录这些操作。为什么不再问一个关于Oracle审计或搜索的问题?