Oracle DDL 触发器:如何检索有关发生的事件的更多详细信息?
Oracle DDL trigger: how to retrieve more details about the event occurred?
我想在 Oracle 数据库上记录当时执行的所有 DDL 操作。
我为此创建了一个 TABLE
和一个 DDL 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 table.
中有一个新行
但我仍然没有任何关于已进行的确切操作类型的信息。
例如,以下两个语句将在 AUDIT_DDL table:
中产生相同的 ALTER
SYSEVENT
ALTER TABLE MYTABLE RENAME COLUMN TEMP TO NEWTEMP;
ALTER TABLE MYTABLE DROP COLUMN NEWTEMP;
因此,通过这种方式,我不知道进行了哪些操作而不是通用的 ALTER TABLE
,我什至不知道列 TEMP 是否已重命名或从 table我的表!
我的问题是:如何在 DDL 执行后检索有关事件发生的更多信息(涉及的对象、详细信息等...)?
检查以下内容:
放下扳机AUDIT_DDL_TRG
drop trigger AUDIT_DDL_TRG
创建一个新列
alter table AUDIT_DDL add statements varchar2(1000);
运行再次触发
CREATE OR REPLACE TRIGGER AUDIT_DDL_TRG
AFTER DDL ON SCHEMA
DECLARE
sql_text ora_name_list_t;
v_stmt VARCHAR2(2000);
n PLS_INTEGER;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
v_stmt := v_stmt || sql_text(i);
END LOOP;
v_stmt :=regexp_replace(v_stmt,
'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)',
'',
1,
1,
'i');
IF (ORA_SYSEVENT = 'TRUNCATE') THEN
NULL;
ELSE
INSERT INTO AUDIT_DDL
(D,
OSUSER,
CURRENT_USER,
HOST,
TERMINAL,
OWNER,
TYPE,
NAME,
SYSEVENT,
statements)
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,
v_stmt);
END IF;
END;
/
做一些改变,你会看到语句
我想在 Oracle 数据库上记录当时执行的所有 DDL 操作。
我为此创建了一个 TABLE
和一个 DDL 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 table.
中有一个新行但我仍然没有任何关于已进行的确切操作类型的信息。
例如,以下两个语句将在 AUDIT_DDL table:
中产生相同的ALTER
SYSEVENT
ALTER TABLE MYTABLE RENAME COLUMN TEMP TO NEWTEMP;
ALTER TABLE MYTABLE DROP COLUMN NEWTEMP;
因此,通过这种方式,我不知道进行了哪些操作而不是通用的 ALTER TABLE
,我什至不知道列 TEMP 是否已重命名或从 table我的表!
我的问题是:如何在 DDL 执行后检索有关事件发生的更多信息(涉及的对象、详细信息等...)?
检查以下内容:
放下扳机AUDIT_DDL_TRG
drop trigger AUDIT_DDL_TRG
创建一个新列
alter table AUDIT_DDL add statements varchar2(1000);
运行再次触发
CREATE OR REPLACE TRIGGER AUDIT_DDL_TRG
AFTER DDL ON SCHEMA
DECLARE
sql_text ora_name_list_t;
v_stmt VARCHAR2(2000);
n PLS_INTEGER;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
v_stmt := v_stmt || sql_text(i);
END LOOP;
v_stmt :=regexp_replace(v_stmt,
'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)',
'',
1,
1,
'i');
IF (ORA_SYSEVENT = 'TRUNCATE') THEN
NULL;
ELSE
INSERT INTO AUDIT_DDL
(D,
OSUSER,
CURRENT_USER,
HOST,
TERMINAL,
OWNER,
TYPE,
NAME,
SYSEVENT,
statements)
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,
v_stmt);
END IF;
END;
/
做一些改变,你会看到语句