Oracle:如何使用DDL触发器记录表重命名事件

时间:2015-09-15 07:58:43

标签: oracle

我正在为所有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;   

请告诉我解决方案。

2 个答案:

答案 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?