9I在线重定义测试

在9I前我们一般通过MOVE的方式来对表的数据重整,如果表非常大,而IO又不块的时候,MOVE的的过程可能相当漫长,
甚至不能在线完成,而且还需要REBUILD索引,这样降低的高可用性。
因此9I提出了DBMS_REDEFINITION包引入了在线表重定义的功能。

该原理类似MV-物化视图

在线重定义由三个大的步骤组成
完全同步 => 增量同步 =>切换

注: oracle9i环境中,不要在sys用户下做,否则会出错,如下部分
SQL> conn /as sysdba
已连接。
SQL>
SQL>  create table t1
  2   as
  3   select * from stage
  4    order by dbms_random.random;

表已创建。

SQL> begin
  2  for x in 1..10
  3  loop insert into t1
  4  select OWNER,OBJECT_NAME,SUBOBJECT_NAME,object_id+x*100000,DATA_OBJECT_ID,OBJECT_TYPE,
  5  CREATED,LAST_DDL_TIME,TIMESTAMP,STATUS,TEMPORARY,GENERATED,SECONDARY from stage;
  6  commit;
  7  end loop;
  8  end;
  9  /

PL/SQL 过程已成功完成。

SQL> alter table t1 add constraint check_gt_zero check (object_id>0);

表已更改。

SQL> create trigger t1_trigger
  2  before insert on t1
  3  begin
  4     dbms_output.put_line( 'hello world' );
  5  end;
  6  /
create trigger t1_trigger
               *
ERROR 位于第 1 行:
ORA-04089: 无法对 SYS 所有的对象创建触发器


SQL> exec dbms_redefinition.can_redef_table( user, 'T1' );
BEGIN dbms_redefinition.can_redef_table( user, 'T1' ); END;

*
ERROR 位于第 1 行:
ORA-12087: 在 "SYS" 拥有的表上不允许联机重新定义
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 247
ORA-06512: 在line 1

下面准备切换到scott用户上测试
SQL> conn /as sysdba
已连接。

SQL> create table scott.stage as select *from stage;

表已创建。

SQL> conn scott/tiger
已连接。

SQL> drop table t1;

表已丢弃。

SQL> create table t1
  2  as
  3  select * from stage
  4   order by dbms_random.random;

表已创建。

SQL> alter table t1 add constraint check_gt_zero check (object_id>0);

表已更改。

SQL>  create trigger t1_trigger
  2   before insert on t1
  3   begin
  4      dbms_output.put_line( 'hello world' );
  5   end;
  6  /

触发器已创建

SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T1'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T1';

'INDEXES'   INDEX_NAME
----------- ------------------------------
constraints SYS_C003068
constraints SYS_C003069
constraints SYS_C003070
constraints SYS_C003071
constraints SYS_C003072
constraints CHECK_GT_ZERO
triggers    T1_TRIGGER

已选择7行。

SQL> desc t1
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                 NOT NULL NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(18)
 CREATED                                   NOT NULL DATE
 LAST_DDL_TIME                             NOT NULL DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
 
SQL> create table t2 (
  2  OWNER                  VARCHAR2(30) not null,   	   
  3  OBJECT_NAME            VARCHAR2(30) not null,
  4  SUBOBJECT_NAME         VARCHAR2(30),
  5  OBJECT_ID              NUMBER not null,
  6  DATA_OBJECT_ID         NUMBER,
  7  OBJECT_TYPE            VARCHAR2(19),
  8  CREATED                DATE not null,
  9  LAST_DDL_TIME          DATE not null,
 10  TIMESTAMP              VARCHAR2(19),
 11  STATUS                 VARCHAR2(7),
 12  TEMPORARY              VARCHAR2(1),
 13  GENERATED              VARCHAR2(1),
 14  SECONDARY              VARCHAR2(1),
 15  NAMESPACE              NUMBER,			==  新增的列      	
 16  EDITION_NAME           VARCHAR2(30)                ==  新增的列      
 17  ) partition by hash(object_id) partitions 8;       ==  设置HASH分区  

表已创建。
 
SQL> exec dbms_redefinition.can_redef_table( user, 'T1' );   ==判断这个表是否能在线重定义,9I只有主键1种,10G还有BY ROWID
BEGIN dbms_redefinition.can_redef_table( user, 'T1' ); END;

      *
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须说明标识符 'DBMS_REDEFINITION'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

==执行失败,因为没有权限


SQL> conn /as sysdba
已连接。

SQL> GRANT EXECUTE ON DBMS_REDEFINITION TO SCOTT; ==这里必须有执行包的权限,注意,即使有DBA权限也没用

授权成功。

SQL> GRANT EXECUTE_CATALOG_ROLE TO SCOTT;

授权成功。

SQL> GRANT CREATE ANY TABLE  TO SCOTT;

授权成功。

SQL> GRANT ALTER ANY TABLE   TO SCOTT;

授权成功。

SQL> GRANT DROP ANY TABLE    TO SCOTT;

授权成功。

SQL> GRANT LOCK ANY TABLE    TO SCOTT;

授权成功。

SQL> GRANT SELECT ANY TABLE  TO SCOTT;

授权成功。

SQL> conn scott/tiger
已连接。


== 下面开始验证是否可以采用PK重定义表,不报错即可

SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk);
BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk); END;

*
ERROR 位于第 1 行:
ORA-12089: 不能联机重新定义无主键的表 "SCOTT"."T1"     == 因为9I默认重定义是基于主键,主键没有,创建不成功
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 247
ORA-06512: 在line 1

SQL> alter table t1 add constraint t1_pk primary key(object_id);

表已更改。


SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT', 'T1' , dbms_redefinition.cons_use_pk);

PL/SQL 过程已成功完成。


== 检查通过,开始重定义

exec dbms_redefinition.start_redef_table( user, 'T1', 'T2','OWNER  OWNER ,OBJECT_NAME OBJECT_NAME ,SUBOBJECT_NAME SUBOBJECT_NAME ,OBJECT_ID OBJECT_ID ,DATA_OBJECT_ID DATA_OBJECT_ID ,OBJECT_TYPE OBJECT_TYPE ,CREATED CREATED ,LAST_DDL_TIME LAST_DDL_TIME ,TIMESTAMP TIMESTAMP ,STATUS STATUS  ,TEMPORARY TEMPORARY ,GENERATED GENERATED ,SECONDARY SECONDARY ,0 NAMESPACE, ''YES'' EDITION_NAME')

*
ERROR 位于第 1 行:
ORA-12091: 不能联机重新定义具有实体化视图的表 "SCOTT"."T1"
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 146
ORA-06512: 在line 1


SQL> exec dbms_redefinition.start_redef_table( user, 'T1', 'T2')
BEGIN dbms_redefinition.start_redef_table( user, 'T1', 'T2'); END;

*
ERROR 位于第 1 行:
ORA-12006: 具有相同 user.name 的实体化视图已经存在   --有时候测试会报这个错误
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 8
ORA-06512: 在"SYS.DBMS_REDEFINITION", line 146
ORA-06512: 在line 1

==解决办法:我们需要将之前步骤中产生的物化视图和日志删除。用下列语句查找并清除:

SQL> select log_table from user_snapshot_logs;

LOG_TABLE
------------------------------
MLOG$_ADMIN_EMP
MLOG$_T1

SQL>
SQL>
SQL> drop snapshot log on t1;

==实体化视图日志已删除。


SQL> select TABLE_NAME , status from user_snapshots;

TABLE_NAME                     STATUS
------------------------------ -------
INT_ADMIN_EMP                  VALID
T2                             VALID

==以前称为SNAPSHOT
==以后的版本称为MVIEW,物化视图
SQL> select mview_name, compile_state from user_mviews;

MVIEW_NAME                     COMPILE_STATE
------------------------------ -------------------
INT_ADMIN_EMP                  ERROR
T2                             ERROR

SQL> drop materialized view T2;

==实体化视图已删除。


exec dbms_redefinition.start_redef_table( user, 'T1', 'T2','OWNER  OWNER ,OBJECT_NAME OBJECT_NAME ,SUBOBJECT_NAME SUBOBJECT_NAME ,OBJECT_ID OBJECT_ID ,DATA_OBJECT_ID DATA_OBJECT_ID ,OBJECT_TYPE OBJECT_TYPE ,CREATED CREATED ,LAST_DDL_TIME LAST_DDL_TIME ,TIMESTAMP TIMESTAMP ,STATUS STATUS  ,TEMPORARY TEMPORARY ,GENERATED GENERATED ,SECONDARY SECONDARY ,0 NAMESPACE, ''YES'' EDITION_NAME'')

PL/SQL 过程已成功完成。


SQL> SELECT COUNT(*) FROM  t1;

  COUNT(*)
----------
    320661

SQL> SELECT COUNT(*) FROM  t2;

  COUNT(*)
----------
    320661
     
     
     
-- 执行拷贝命令,关联相关对象

DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('scott', 't1','t2',DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;

ERROR 位于第 4 行:
ORA-06550: 第 4 行, 第 78 列:
PLS-00302: 必须说明 'CONS_ORIG_PARAMS' 组件
ORA-06550: 第 4 行, 第 1 列:
PL/SQL: Statement ignored


== COPY_TABLE_DEPENDENTS 是10g的新特性,9i中不存在


SQL> alter table t2 add constraint t2_check_gt_zero check (object_id>0);

表已更改。

SQL> alter table t2 add constraint t2_pk primary key(object_id);

表已更改。

SQL> create trigger t2_trigger
  2  before insert on t2
  3  begin
  4     dbms_output.put_line( 'hello world' );
  5  end;
  6  /

触发器已创建

SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T1'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T1';

'INDEXES'   INDEX_NAME
----------- ------------------------------
indexes     T1_PK
constraints SYS_C003088
constraints SYS_C003089
constraints SYS_C003090
constraints SYS_C003091
constraints SYS_C003092
constraints CHECK_GT_ZERO
constraints T1_PK
triggers    T1_TRIGGER

已选择9行。

SQL> select 'indexes', index_name from user_indexes where table_name = 'T2'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T2'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T2';

'INDEXES'   INDEX_NAME
----------- ------------------------------
indexes     T2_PK
constraints SYS_C003094
constraints SYS_C003095
constraints SYS_C003096
constraints SYS_C003097
constraints SYS_C003098
constraints T2_CHECK_GT_ZERO
constraints T2_PK
triggers    T2_TRIGGER

已选择9行。



== session 2 插入一条新纪录 --

SQL> insert into t1(OWNER,OBJECT_NAME,OBJECT_ID,CREATED,LAST_DDL_TIME)
  2  values ('SYS','HELLO',1888888,sysdate-1,sysdate);

已创建 1 行。

SQL> commit;

提交完成。



== 回到 session 1 
==sync_interim_table能够将新增的数据同步到中间表,并且加速FINISH的同步工作量,FINISH会锁表

SQL> exec dbms_redefinition.sync_interim_table('scott', 't1', 't2');

PL/SQL 过程已成功完成。

SQL> select * from t2 where object_id=1888888;

OWNER                          OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- -------------------
CREATED    LAST_DDL_T TIMESTAMP           STATUS  T G S  NAMESPACE
---------- ---------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
SYS                            HELLO
                                  1888888
07-5月 -09 08-5月 -09                                            0
YES


SQL> SELECT COUNT(*) FROM  t1;

  COUNT(*)
----------
    320662

SQL> SELECT COUNT(*) FROM  t2;

  COUNT(*)
----------
    320662




==将中间表同步原表,完成重定义


SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T1','T2')

PL/SQL 过程已成功完成。

SQL> desc t1
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                 NOT NULL NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                   NOT NULL DATE
 LAST_DDL_TIME                             NOT NULL DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
 NAMESPACE                                          NUMBER
 EDITION_NAME                                       VARCHAR2(30)


SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T1'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T1';

'INDEXES'   INDEX_NAME
----------- ------------------------------
indexes     T2_PK
constraints SYS_C003094
constraints SYS_C003095
constraints SYS_C003096
constraints SYS_C003097
constraints SYS_C003098
constraints T2_CHECK_GT_ZERO
constraints T2_PK
triggers    T2_TRIGGER

已选择9行。

SQL> select count(*) from t1;

  COUNT(*)
----------
    320662

SQL> select * from t1 where object_id=1888888;

OWNER                          OBJECT_NAME
------------------------------ ------------------------------
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------- -------------------
CREATED    LAST_DDL_T TIMESTAMP           STATUS  T G S  NAMESPACE
---------- ---------- ------------------- ------- - - - ----------
EDITION_NAME
------------------------------
SYS                            HELLO
                               1888888
07-5月 -09 08-5月 -09                                            0
YES




==增量的1888888记录也同步进去了
==注意,T2在START_REDEF_TABLE前可以建立索引、触发器、约束,这样在FINISH后不需要单独再进行交换


10G在线重定义测试
~~~~~~~~~~~~~~~

测试结果:
SQL> create table t1
  2  as
  3  select * from stage
  4   order by dbms_random.random;


SQL> alter table t1 add constraint t1_pk primary key(object_id);

表已更改。

SQL> alter table t1 add constraint check_gt_zero check (object_id>0);

表已更改。

SQL> create trigger t1_trigger
  2  before insert on t1
  3  begin
  4     dbms_output.put_line( 'hello world' );
  5  end;
  6  /

触发器已创建

SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T1'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T1';

'INDEXES'   INDEX_NAME
----------- ------------------------------
indexes     T1_PK
constraints SYS_C005428
constraints SYS_C005429
constraints SYS_C005430
constraints SYS_C005431
constraints SYS_C005432
constraints T1_PK
constraints CHECK_GT_ZERO
triggers    T1_TRIGGER

已选择9行。

SQL> desc t1
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- -----------------------------------

 OWNER                                                             NOT NULL VARCHAR2(30)
 OBJECT_NAME                                                       NOT NULL VARCHAR2(30)
 SUBOBJECT_NAME                                                             VARCHAR2(30)
 OBJECT_ID                                                         NOT NULL NUMBER
 DATA_OBJECT_ID                                                             NUMBER
 OBJECT_TYPE                                                                VARCHAR2(19)
 CREATED                                                           NOT NULL DATE
 LAST_DDL_TIME                                                     NOT NULL DATE
 TIMESTAMP                                                                  VARCHAR2(19)
 STATUS                                                                     VARCHAR2(7)
 TEMPORARY                                                                  VARCHAR2(1)
 GENERATED                                                                  VARCHAR2(1)
 SECONDARY                                                                  VARCHAR2(1)

SQL> create table t2 (
  2  OWNER                  VARCHAR2(30),
  3  OBJECT_NAME            VARCHAR2(30),
  4  SUBOBJECT_NAME         VARCHAR2(30),
  5  OBJECT_ID              NUMBER,
  6  DATA_OBJECT_ID         NUMBER,
  7  OBJECT_TYPE            VARCHAR2(19),
  8  CREATED                DATE,
  9  LAST_DDL_TIME          DATE,
 10  TIMESTAMP              VARCHAR2(19),
 11  STATUS                 VARCHAR2(7),
 12  TEMPORARY              VARCHAR2(1),
 13  GENERATED              VARCHAR2(1),
 14  SECONDARY              VARCHAR2(1),
 15  NAMESPACE              NUMBER,
 16  EDITION_NAME           VARCHAR2(30)
 17  ) partition by hash(object_id) partitions 8;
create table t2 (
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


SQL> drop table t2;

表已删除。

create table t2 (                                 
OWNER                  VARCHAR2(30),              
OBJECT_NAME            VARCHAR2(30),              
SUBOBJECT_NAME         VARCHAR2(30),              
OBJECT_ID              NUMBER,                    
DATA_OBJECT_ID         NUMBER,                    
OBJECT_TYPE            VARCHAR2(19),              
CREATED                DATE,                      
LAST_DDL_TIME          DATE,                      
TIMESTAMP              VARCHAR2(19),              
STATUS                 VARCHAR2(7),               
TEMPORARY              VARCHAR2(1),               
GENERATED              VARCHAR2(1),               
SECONDARY              VARCHAR2(1),               
NAMESPACE              NUMBER,              ==  新增的列    
EDITION_NAME           VARCHAR2(30)         ==  新增的列    
) partition by hash(object_id) partitions 8;==  设置HASH分区      


Table altered.  


       

表已创建。

SQL> exec dbms_redefinition.can_redef_table( user, 'T1' );

PL/SQL 过程已成功完成。

SQL> exec dbms_monitor.session_trace_enable;

PL/SQL 过程已成功完成。

SQL> exec dbms_redefinition.start_redef_table( user, 'T1', 'T2', orderby_cols => 'OBJECT_ID' );
BEGIN dbms_redefinition.start_redef_table( user, 'T1', 'T2', orderby_cols => 'OBJECT_ID' ); END;

*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 50
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1343
ORA-06512: 在 line 1
--用sys登陆执行 start-------------------------------------------
SQL> exec dbms_redefinition.start_redef_table( 'TESTUSER', 'T1', 'T2', orderby_cols => 'OBJECT_ID' )

PL/SQL 过程已成功完成。


--用sys登陆执行 end-------------------------------------------

SQL> select object_id, object_name from t1 OLD_TABLE where rownum<=5;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
     28591 /7e59f4a3_SystemIdentity
     27656 /c7e340d5_FontRenderContext
     15623 /9be69f43_BasicSplitPaneUIFocu
     37397 com/sun/mail/pop3/Status
      7551 DBA_REPOBJECT

SQL> select object_id, object_name from t2 NEW_TABLE where rownum<=5;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
       931 V$PGA_TARGET_ADVICE
       943 V$DLM_MISC
       955 V$DLM_RESS
       957 V$HVMASTER_INFO
       984 V_$BH
--用sys登陆执行 start-------------------------------------------
SQL> variable nerrors number
SQL> begin
  2     dbms_redefinition.copy_table_dependents
  3     ( 'TESTUSER', 'T1', 'T2',
  4       copy_indexes => dbms_redefinition.cons_orig_params,
  5       num_errors => :nerrors );
  6  end;
  7  /

PL/SQL 过程已成功完成。

SQL> print nerrors

   NERRORS
----------
         0

--用sys登陆执行 end-------------------------------------------

SQL> select table_name, 'indexes', index_name from user_indexes where table_name in ('T1','T2')
  2  union all
  3  select table_name, 'constraints', constraint_name from user_constraints where table_name in ('T1','T2')
  4  union all
  5  select table_name, 'triggers', trigger_name from user_triggers where table_name in ('T1','T2');

TABLE_NAME                     'INDEXES'   INDEX_NAME
------------------------------ ----------- ------------------------------
T2                             indexes     TMP$$_T1_PK0
T1                             indexes     T1_PK
T1                             constraints SYS_C005428
T1                             constraints SYS_C005429
T1                             constraints SYS_C005430
T1                             constraints SYS_C005431
T1                             constraints SYS_C005432
T1                             constraints T1_PK
T1                             constraints CHECK_GT_ZERO
T2                             constraints TMP$$_CHECK_GT_ZERO0
T2                             constraints TMP$$_SYS_C0054280

TABLE_NAME                     'INDEXES'   INDEX_NAME
------------------------------ ----------- ------------------------------
T2                             constraints TMP$$_SYS_C0054290
T2                             constraints TMP$$_SYS_C0054300
T2                             constraints TMP$$_SYS_C0054310
T2                             constraints TMP$$_SYS_C0054320
T2                             constraints TMP$$_T1_PK0
T1                             triggers    T1_TRIGGER
T2                             triggers    TMP$$_T1_TRIGGER0

已选择18行。

SQL> exec dbms_redefinition.finish_redef_table( user, 'T1', 'T2' );
BEGIN dbms_redefinition.finish_redef_table( user, 'T1', 'T2' ); END;

*
第 1 行出现错误:
ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 76
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1376
ORA-06512: 在 line 1
--用sys登陆执行 start-------------------------------------------
SQL> exec dbms_redefinition.finish_redef_table( 'TESTUSER', 'T1', 'T2' );

PL/SQL 过程已成功完成。

SQL>


--用sys登陆执行 end-------------------------------------------

SQL> select object_id, object_name from t1 NEW_TABLE where rownum<=5;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
       931 V$PGA_TARGET_ADVICE
       943 V$DLM_MISC
       955 V$DLM_RESS
       957 V$HVMASTER_INFO
       984 V_$BH

SQL> select object_id, object_name from t2 OLD_TABLE where rownum<=5;

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
     28591 /7e59f4a3_SystemIdentity
     27656 /c7e340d5_FontRenderContext
     15623 /9be69f43_BasicSplitPaneUIFocu
     37397 com/sun/mail/pop3/Status
      7551 DBA_REPOBJECT

SQL> select 'indexes', index_name from user_indexes where table_name = 'T1'
  2  union all
  3  select 'constraints', constraint_name from user_constraints where table_name = 'T1'
  4  union all
  5  select 'triggers', trigger_name from user_triggers where table_name = 'T1';

'INDEXES'   INDEX_NAME
----------- ------------------------------
indexes     T1_PK
constraints CHECK_GT_ZERO
constraints SYS_C005428
constraints SYS_C005429
constraints SYS_C005430
constraints SYS_C005431
constraints SYS_C005432
constraints T1_PK
triggers    T1_TRIGGER

已选择9行。

SQL> drop table t2;

表已删除。

SQL> SET LINESIZE 1000
SQL> SET FEEDBACK OFF
SQL> set long 999999
SQL> SET PAGESIZE 1000
SQL> select dbms_metadata.get_ddl( 'TABLE', 'T1' ) from dual;

DBMS_METADATA.GET_DDL('TABLE','T1')
--------------------------------------------------------------------------------

  CREATE TABLE "TESTUSER"."T1"
   (    "OWNER" VARCHAR2(30) CONSTRAINT "SYS_C005428" NOT NULL ENABLE NOVALIDATE,
        "OBJECT_NAME" VARCHAR2(30) CONSTRAINT "SYS_C005429" NOT NULL ENABLE NOVALIDATE,
        "SUBOBJECT_NAME" VARCHAR2(30),
        "OBJECT_ID" NUMBER CONSTRAINT "SYS_C005430" NOT NULL ENABLE NOVALIDATE,
        "DATA_OBJECT_ID" NUMBER,
        "OBJECT_TYPE" VARCHAR2(19),
        "CREATED" DATE CONSTRAINT "SYS_C005431" NOT NULL ENABLE NOVALIDATE,
        "LAST_DDL_TIME" DATE CONSTRAINT "SYS_C005432" NOT NULL ENABLE NOVALIDATE,
        "TIMESTAMP" VARCHAR2(19),
        "STATUS" VARCHAR2(7),
        "TEMPORARY" VARCHAR2(1),
        "GENERATED" VARCHAR2(1),
        "SECONDARY" VARCHAR2(1),
        "NAMESPACE" NUMBER,
        "EDITION_NAME" VARCHAR2(30),
         CONSTRAINT "CHECK_GT_ZERO" CHECK (object_id>0) ENABLE NOVALIDATE,
         CONSTRAINT "T1_PK" PRIMARY KEY ("OBJECT_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "TESTTBS"  ENABLE NOVALIDATE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
  STORAGE(
  BUFFER_POOL DEFAULT)
  TABLESPACE "TESTTBS"
  PARTITION BY HASH ("OBJECT_ID")
 (PARTITION "SYS_P41"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P42"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P43"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P44"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P45"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P46"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P47"
   TABLESPACE "TESTTBS",
 PARTITION "SYS_P48"
   TABLESPACE "TESTTBS")


SQL>


你可能感兴趣的:(oracle,9I在线重定义测试)