我正在为所有DDL事件使用以下DDL触发器。 但是在表重命名的情况下不会执行它。
我的DDL声明是:
更改表" ABC"重命名为" ABC1"
CREATE OR REPLACE TRIGGER AUDIT_DDL_TRIGGER AFTER ddl ON schema
DECLARE
BEGIN
INSERT
INTO DD_DB_OBJECT_DDL_LOG
(
LAST_UPD_TS,
osuser,
current_user,
host,
terminal,
owner,
type,
name,
sysevent
)
VALUES
(
CURRENT_TIMESTAMP,
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;
请告诉我解决方案。
答案 0 :(得分:2)
您在创建触发器时使用了AFTER DDL
关键字。用户AFTER RENAME
关键字,用于在重命名数据库对象时触发。
实施例
create or replace TRIGGER AUDIT_DDL_TRIGGER AFTER ddl or ALTER OR RENAME ON schema
DECLARE
sql_text ora_name_list_t;
n pls_integer;
IS_ALLOWED_TBL_TYPE NUMBER(1) := 0;
IP_PREFIX VARCHAR(50);
V_OLD_NAME VARCHAR2(30);
V_NEW_NAME VARCHAR2(30);
v_stmt VARCHAR(32000);
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP
v_stmt := v_stmt || sql_text(i);
END LOOP;
V_OLD_NAME:=regexp_replace( v_stmt, 'rename[[:space:]]+([a-z0-9_]+)[[:space:]]+to.*', '\1', 1, 1, 'i' );
V_NEW_NAME:=regexp_replace( v_stmt, 'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)', '\1', 1, 1, 'i' );
Dbms_Output.Put_Line( 'Old Name: ' || V_OLD_NAME);
Dbms_Output.Put_Line( 'New Name: ' || V_NEW_NAME);
END;
答案 1 :(得分:1)
使用AFTER DDL OR ALTER OR RENAME
。
然后你必须从alter / rename语句中提取新的表名
就像这样Oracle: How do I determine the NEW name of an object in an "AFTER ALTER" trigger?