首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SQL*Plus的desc表在使用dbms_redefinition后不显示非空约束

为什么SQL*Plus的desc表在使用dbms_redefinition后不显示非空约束
EN

Database Administration用户
提问于 2013-12-16 07:32:56
回答 1查看 3.8K关注 0票数 5

我要重新定义下表:

代码语言:javascript
复制
create table tq84_redefinition (
  id number primary key,
  ts1 timestamp not null,
  ts2 timestamp
);

请注意列not nullts1约束。

使用dbms_redefinition,我特别使用copy_constraints => true

代码语言:javascript
复制
create table tq84_redefinition_int (
    id number,                            -- Note: no primary key to prevent «ORA-01408: such column list already indexed»
    ts1 date,
    ts2 date,
    duration_minutes as ((ts2 - ts1) * 24 * 60)
);


begin
  dbms_redefinition.start_redef_table(
    user, 'tq84_redefinition', 'tq84_redefinition_int',
   'id, '               ||
   'to_date(to_char(ts1, ''ddmmyyyyhh24miss''), ''ddmmyyyyhh24miss'') ts1, ' ||
   'to_date(to_char(ts2, ''ddmmyyyyhh24miss''), ''ddmmyyyyhh24miss'') ts2');
end;
/



-- set serveroutput on

declare  
  cnt_errors binary_integer;
begin

  dbms_redefinition.copy_table_dependents(
    user, 'tq84_redefinition', 'tq84_redefinition_int', 
    -------------------------------------------------------
    copy_indexes     => dbms_redefinition.cons_orig_params,
    copy_triggers    => true, 
    copy_constraints => true, 
    copy_privileges  => true, 
    ignore_errors    => false, 
    num_errors       => cnt_errors,
    copy_statistics  => true, 
    copy_mvlog       => false);

  if cnt_errors > 0 then
     dbms_output.put_line('There were ' || cnt_errors || ' errors.');
  end if;

end;
/

exec dbms_redefinition.sync_interim_table(user, 'tq84_redefinition', 'tq84_redefinition_int');
exec dbms_redefinition.finish_redef_table(user, 'tq84_redefinition', 'tq84_redefinition_int');

除了SQL*Plus中的desc没有正确显示not null约束外,一切看起来都很好:

代码语言:javascript
复制
...> desc tq84_redefinition;
 Name                        Null?    Type
 --------------------------- -------- ---------------
 ID                                   NUMBER
 TS1                                  DATE
 TS2                                  DATE
 DURATION_MINUTES                     NUMBER

但是,在某个地方,null约束已经到位。我可以通过发出一个

代码语言:javascript
复制
select constraint_type, constraint_name, search_condition
  from user_constraints
 where table_name = 'TQ84_REDEFINITION';

另外,如果我试图插入一个记录insert into tq84_redefinition (id) values (999999),就会得到(正确的)错误消息ORA-01400: cannot insert NULL into ("META"."TQ84_REDEFINITION"."TS1")

编辑:版本(v$版本)是:

代码语言:javascript
复制
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

编辑2 @Munchi,您建议的select语句的结果

代码语言:javascript
复制
select 
  column_name as "Name",
  nullable as "Null?",
  concat(concat(concat(data_type,'('),data_length),')') as "Type"
from
  user_tab_columns
where
  table_name = 'TQ84_REDEFINITION'

代码语言:javascript
复制
Name                           N Type
------------------------------ - --------------
ID                             Y NUMBER(22)
TS1                            Y DATE(7)
TS2                            Y DATE(7)
DURATION_MINUTES               Y NUMBER(22)
EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-12-16 11:11:02

这是一个已知的错误(不幸的是,描述不是公开的):

Bug:4396234 ET10.2OREDEF:*_TAB_COLUMNS表的NULLABLE COL在联机REDEF

之后未更新

NULL约束被复制为NOVALIDATE,您必须将它们设置为手动验证状态,例如:

代码语言:javascript
复制
ALTER TABLE t84_redefenition ENABLE VALIDATE CONSTRAINT constraint_name;

主要的关键问题类似,但没有报告的bug。然而,我发现禁用和重新启用它可以解决问题。

代码语言:javascript
复制
ALTER TABLE t84_redefinition DISABLE PRIMARY KEY;
ALTER TABLE t84_redefinition ENABLE PRIMARY KEY;
票数 11
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/55081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档