0

我们有使用“NOROWDEPENDENCIES”(默认值)创建的表。我在 oracle 文档中读到,这样做的唯一两种方法是:

使用 DBMS_REDEFINITION 包重新定义表或重新创建表。

我无法重新创建表,所以我唯一的解决方案是重新定义它,但我在任何地方都找不到示例或指南来执行此操作。

你能给我看一个例子或参考任何指南吗?谢谢

4

1 回答 1

1

首先,您必须检查您的表是否允许重新定义。如果以下过程返回异常,则不允许:

BEGIN
     DBMS_REDEFINITION.CAN_REDEF_TABLE(
                  uname => '<USER NAME>',
                  orig_table => '<TABLE NAME>'
     );
END;
/

如果可以重新定义表,则必须在具有所需属性的相同模式上创建一个临时表。执行(表中没有映射列):

BEGIN
     DBMS_REDEFINITION.start_redef_table (
                  uname => '<USER NAME>',
                  orig_table => '<TABLE NAME>',
                  int_table => 'INTERIM'
     );
END;
/

如果一切正常,您可以完成执行该过程的过程:

BEGIN
     DBMS_REDEFINITION.finish_redef_table (
                  uname => '<USER NAME>',
                  orig_table => '<TABLE NAME>',
                  int_table => 'INTERIM');
END;
/

在使用前面的过程完成重新定义之前,您可以在临时表上创建索引、约束等。

如果要使临时表与原始表保持同步,您可能还需要:

BEGIN
     DBMS_REDEFINITION.sync_interim_table (
                  uname => '<USER NAME>',
                  orig_table => '<TABLE NAME>',
                  int_table => 'INTERIM');
END;
/

在 FINISH_REDEF_TABLE 过程之前调用。dbms_redefinition.copy_table_dependents(..); 对完成工作很有用。要中止重新定义过程,您可能需要:

BEGIN
     DBMS_REDEFINITION.abort_redef_table (
                  uname => '<USER NAME>',
                  orig_table => '<TABLE NAME>',
                  int_table => 'INTERIM');
END;
/

请注意,如果原始表很大,您可能需要很多空间。如果系统在线,则应监控重新定义。它可能很重。

于 2021-01-31T18:13:59.553 回答