sql >> Databáze >  >> RDS >> Oracle

Oracle:Jak zjistím NOVÝ název objektu ve spouštěči AFTER ALTER?

ALTER RENAME nespustí spouštěč, RENAME x TO y bude.

Pokud jde o vaši otázku o jménech před a po, myslím, že budete muset analyzovat DDL, abyste je získali, takto:

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;

Regulární výrazy by jistě mohly být napsány jasněji, ale funguje to:

RENAME 
mktestx
TO                 mktesty;

Before: mktestx
After: mktesty

AKTUALIZACE Chcete-li vyhovět změněné otázce:

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. Špičkové techniky, jak se vyhnout „odstranění dat“ z databáze webových stránek

  2. SQLSTATE[22007]:Neplatný formát data a času:1366 Nesprávná celočíselná hodnota:'název_sloupce' v Laravelu

  3. Jak vrátím více sad výsledků pomocí SqlCommand?

  4. Řešení Gaps and Islands v Oracle - použití rekurzivního