【问题标题】:Oracle : How to Log Table Rename Event using DDL TriggerOracle:如何使用 DDL 触发器记录表重命名事件
【发布时间】:2015-12-11 09:26:28
【问题描述】:

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

请给我建议解决方案。

【问题讨论】:

标签: oracle


【解决方案1】:

您在创建触发器时使用了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;  

【讨论】:

    【解决方案2】:

    使用AFTER DDL OR ALTER OR RENAME
    然后你必须从 alter/rename 语句中提取新的表名。
    像这样Oracle: How do I determine the NEW name of an object in an "AFTER ALTER" trigger?

    【讨论】:

    • 但它没有在我的日志表中创建新表名日志。它只是创建旧表的 ALTER 事件。而我的 DDL 语句是 -> 将表“ABC”重命名为“ABC1”
    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2016-07-27
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多