Oracle 甲骨文:我如何确定一个对象的新名称;在ALTER之后;触发

Oracle 甲骨文:我如何确定一个对象的新名称;在ALTER之后;触发,oracle,triggers,rename,Oracle,Triggers,Rename,假设我在Oracle数据库上有一个AFTER ALTER触发器,我重命名了一些数据库对象(ALTER…rename TO…)。在触发器中,如何确定数据库对象的新名称?似乎ORA_DICT_OBJ_OWNER、ORA_DICT_OBJ_NAME和ORA_DICT_OBJ_TYPE函数都返回数据库对象的旧值 例如: CREATE OR REPLACE TRIGGER ADAM_BEFORE_AFTER BEFORE ALTER ON DATABASE BEGIN DBMS_OUTPUT.put_

假设我在Oracle数据库上有一个
AFTER ALTER
触发器,我重命名了一些数据库对象(
ALTER…rename TO…
)。在触发器中,如何确定数据库对象的名称?似乎
ORA_DICT_OBJ_OWNER
ORA_DICT_OBJ_NAME
ORA_DICT_OBJ_TYPE
函数都返回数据库对象的旧值

例如:

CREATE OR REPLACE TRIGGER ADAM_BEFORE_AFTER BEFORE ALTER ON DATABASE
BEGIN
  DBMS_OUTPUT.put_line('Before alter: ' || ora_dict_obj_owner || '.' || ora_dict_obj_name || ' (' || ora_dict_obj_type || ')');
END;

CREATE OR REPLACE TRIGGER ADAM_AFTER_ALTER AFTER ALTER ON DATABASE
BEGIN
  DBMS_OUTPUT.put_line('After alter: ' || ora_dict_obj_owner || '.' || ora_dict_obj_name || ' (' || ora_dict_obj_type || ')');
END;
假设我重命名一个表:

ALTER TABLE USELESS_TABLE9 RENAME TO USELESS_TABLE10
数据库输出以下内容:

Before alter: DEVELOPER.USELESS_TABLE9 (TABLE) After alter: DEVELOPER.USELESS_TABLE9 (TABLE) 更改前:DEVELOPER.u表9(表) 更改后:DEVELOPER.u\TABLE9(TABLE) 更新:不幸的是,我上面给出的输出不正确。输出实际上是由我先前创建的DDL触发器之前的
和DDL
触发器之后的
生成的,而不是由重命名之前的
和重命名之后的
触发器生成的。我将继续调查为什么重命名前的
和重命名后的
触发器未触发


更新:似乎重命名之前的
和重命名之后的
触发器拒绝激发,但ALTER之前的
和ALTER之后的
触发器拒绝激发。我已经相应地更新了问题。

alterrename
不会触发触发器,
将x重命名为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;