When 语句怎么写,怎样得到新老结构?

解决方案 »

  1.   

    trigger是基于dml的操作的,能基于ddl操作?
      

  2.   

    恩,是的,可以。比如基于数据库级别的after ddl on database
      

  3.   

    怎样得到修改前的结构和修改后的结构,
    像DML中的:old ,:new
      

  4.   

    怎样得到修改前的结构和修改后的结构,这个应该不行,除非你自己搞一个log表记录
      

  5.   

    记录了也不能及时把结构同步到另一个表上,我想最及时的方式就是用DDL Trigger了吧
      

  6.   

    DDL Trigger 将操作记录起来,并修改相应表:CREATE OR REPLACE TRIGGER TRG_INTERFACE_BASE
       AFTER CREATE OR ALTER OR DROP OR TRUNCATE ON DATABASE
       
    DECLARE
     oper i_ddl_log.operation%TYPE;
     txt_value varchar2(1800);
     num_count number;
     CURSOR C1 IS 
        SELECT ora_sysevent T_EVT, ora_dict_obj_owner T_OWNER,
        ora_dict_obj_name T_NAME, upper(sql_text) T_TXT, USER T_USER, SYSDATE T_DATE
        FROM gv$open_cursor;
    BEGIN
      SELECT ora_sysevent
      INTO oper
      FROM dual;
      
      FOR LP IN C1 LOOP
        select count(*) into num_count from I_TBLS WHERE TBL_NAME=lp.t_name AND FLG_CHECK='1';
        IF NUM_COUNT>0 THEN  
          IF LP.T_TXT LIKE LP.T_EVT || ' TABLE %' THEN      
            IF OPER IN ('CREATE','DROP','TRUNCATE','ALTER') THEN
              INSERT INTO I_DDL_LOG (
                OPERATION   ,
                OBJ_OWNER   ,
                OBJECT_NAME ,
                SQL_TEXT    ,
                ATTEMPT_BY  ,
                ATTEMPT_DT  ,
                FLG_EXEC
                ) values(
                LP.T_EVT,
                LP.T_OWNER,
                LP.T_NAME,
                LP.T_TXT,
                LP.T_USER,
                LP.T_DATE,
                '0'
                );
               select lp.t_txt into txt_value from dual;
               txt_value := replace(txt_value,lp.t_name,'I_' || lp.t_name);
               execute immediate txt_value;       
            END IF;          
          END IF;
        END IF;
        
      END LOOP;/*  EXCEPTION
        WHEN OTHERS THEN
          raise_application_error (num      => -20000,
            msg      =>    'TRG_INTERFACE_BASE 未知错误,需人为干预.');*/
      
    END;