我想在 Oracle DB 上记录当时执行的所有 DDL 操作的历史记录。
我以这种方式创建了 aTABLE
和 aDDL TRIGGER
来做到这一点:
CREATE TABLE AUDIT_DDL (
D DATE,
OSUSER VARCHAR2(255),
CURRENT_USER VARCHAR2(255),
HOST VARCHAR2(255),
TERMINAL VARCHAR2(255),
OWNER VARCHAR2(30),
TYPE VARCHAR2(30),
NAME VARCHAR2(30),
SYSEVENT VARCHAR2(30));
--/
CREATE OR REPLACE TRIGGER AUDIT_DDL_TRG AFTER DDL ON SCHEMA
BEGIN
IF (ORA_SYSEVENT='TRUNCATE')
THEN
NULL;
ELSE
INSERT INTO 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;
/
这非常有效:在每个 DDL 语句之后,我在 AUDIT_DDL 表中有一个新行。
但我仍然没有任何关于具体操作类型的信息。
例如,以下两个语句将ALTER
在 AUDIT_DDL 表中生成相同的 SYSEVENT:
ALTER TABLE MYTABLE RENAME COLUMN TEMP TO NEWTEMP;
ALTER TABLE MYTABLE DROP COLUMN NEWTEMP;
所以,通过这种方式,我不知道做了什么操作而不是泛型ALTER TABLE
,我什至不知道 TEMP 列是否已被重命名或从表 MYTABLE 中删除!
我的问题是:如何在 DDL 执行后检索有关事件发生的更多信息(涉及的对象、详细信息等)?