3

ORACLE 的 dbms_redefinition.copy_table_dependents 复制索引/触发器/约束并将它们重命名为

TMP$$_[original object name]

是否可以更改字符串 "TMP$$_" ,以便 copy_table_dependents 使用不同的前缀?我知道我可以在之后重命名对象,但我想知道是否可以更改前缀。

4

1 回答 1

2

不,您不能更改 object_name。

我认为这并不重要,因为TMP$$一旦你运行这些对象就会被删除DBMS_REDEFINITION.FINISH_REDEF_TABLE

如果假设以下环境

create table test_redef_source ( id number, tstamp date, primary key (id) );

create or replace trigger tr_test_redef_sources
 before insert on test_redef_source
 for each row
begin
  :new.tstamp := sysdate;
end;
/

create table test_redef_int as
select * from test_redef_source;

declare
   l_errors number;
begin
   dbms_redefinition.start_redef_table (
          uname =>  user
        , orig_table => 'TEST_REDEF_SOURCE'
        , int_table => 'TEST_REDEF_INT'
           );
   dbms_redefinition.copy_table_dependents (
          uname => user
        , orig_table => 'TEST_REDEF_SOURCE'
        , int_table => 'TEST_REDEF_INT'
        , copy_indexes => 1
        , num_errors => l_errors
          );
end;
/

您可以通过查询USER_DEPENDENCIES看到;对象TMP$$依赖于临时表:

select name, type, referenced_name
  from user_dependencies
 where referenced_name like '%TEST_REDEF%'
       ;

NAME                           TYPE               REFERENCED_NAME
------------------------------ ------------------ --------------------
TMP$$_TR_TEST_REDEF_SOURCES0   TRIGGER            TEST_REDEF_INT
TR_TEST_REDEF_SOURCES          TRIGGER            TEST_REDEF_SOURCE

当您完成重新定义时;这些对象被删除:

begin
   dbms_redefinition.finish_redef_table (
          uname => user
        , orig_table => 'TEST_REDEF_SOURCE'
        , int_table => 'TEST_REDEF_INT'
          );
end;
/

PL/SQL procedure successfully completed.

select name, type, referenced_name
  from user_dependencies
 where referenced_name like '%TEST_REDEF%'
       ;

NAME                           TYPE               REFERENCED_NAME
------------------------------ ------------------ --------------------
TR_TEST_REDEF_SOURCES          TRIGGER            TEST_REDEF_SOURCE

因为它们只是临时对象,并且名称保证是唯一的;我认为维护标准名称没有任何特殊问题。

于 2014-06-14T16:52:19.440 回答