sql >> データベース >  >> RDS >> Oracle

Oracle:AFTER ALTERトリガーでオブジェクトの新しい名前を判別するにはどうすればよいですか?

    ALTER RENAME トリガーを起動しません、RENAME x TO y

    前後の名前についての質問については、次のようにDDLを解析して取得する必要があると思います。

    CREATE OR REPLACE TRIGGER MK_BEFORE_RENAME BEFORE RENAME 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;
    
      Dbms_Output.Put_Line( 'Before: ' || regexp_replace( v_stmt, 'rename[[:space:]]+([a-z0-9_]+)[[:space:]]+to.*', '\1', 1, 1, 'i' ) );
      Dbms_Output.Put_Line( 'After: ' || regexp_replace( v_stmt, 'rename[[:space:]]+.*[[:space:]]+to[[:space:]]+([a-z0-9_]+)', '\1', 1, 1, 'i' ) );
    END;
    

    正規表現は確かにより明確に記述できますが、機能します:

    RENAME 
    mktestx
    TO                 mktesty;
    
    Before: mktestx
    After: mktesty
    

    更新 変更された質問に対応するには:

    CREATE OR REPLACE TRIGGER MK_AFTER_ALTER AFTER ALTER 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;
    
      Dbms_Output.Put_Line( 'Before: ' || regexp_replace( v_stmt, 'alter[[:space:]]+table[[:space:]]+([a-z0-9_]+)[[:space:]]+rename[[:space:]]+to.*', '\1', 1, 1, 'i' ) );
      Dbms_Output.Put_Line( 'After: ' || regexp_replace( v_stmt, 'alter[[:space:]]+table[[:space:]]+.*to[[:space:]]+([a-z0-9_]+)', '\1', 1, 1, 'i' ) );
    END;
    



    1. Oracle SQL Developerでデータベース名を照会する方法は?

    2. SQLの複数のLIKEステートメント

    3. ゲストvirtualboxからホストのmysqlにアクセスします

    4. uuidを使用できず、それを使用するための拡張機能を作成できません