Chinaunix首页 | 论坛 | 博客
  • 博客访问: 847624
  • 博文数量: 105
  • 博客积分: 636
  • 博客等级: 中士
  • 技术积分: 1704
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-11 10:57
文章分类

全部博文(105)

文章存档

2017年(4)

2016年(9)

2015年(18)

2014年(16)

2013年(34)

2012年(24)

分类: Oracle

2013-03-09 21:27:07

昨天遇到了一个ora-02443  无法删除约束条件 - 不存在的约束条件的问题。虽然是小问题 把我的思路拿出来和大家分享一下
希望对大家以后解决oracle问题能有所帮助
1.事件起因
       同事用power design 产生了一个创建表的脚本,这个表创建了一个主键索引
       但可能是因为设计产生了变化 然后就把这个表给drop掉了。再创建表 创建主键的时候
       提示 约束名已经存在。
2.事情的分析
       1) 我看到这个现象时首先 我看了一下创建表和约束的脚本,这个脚本是分两步的 (1)create table (表明暂时称为tb)
        (2)alter table table_name add constraints primary_name primary key (col_name) using index tablespace tb_name
        在创建表时没有问题,给表加主键约束时提示约束名已经存在。
       2)然后我查看了一下oracle的关于约束和索引的两个视图 dba_constraints 和dba_indexes 里面果然有此约束(此处暂时称为pk_tb),
       索引和约束所依附的表名是tb
       3)我不知道 现在的这个主键约束是不是表tb的,于是我drop 掉刚刚创建的tb表。结果约束和索引都还在。
            我现在有点理解了 应该是在drop table的时候 表所附带的主键约束和索引没有被一起删除掉。可是在drop table时,如果能顺利的执行的话
             附带在表上得这些 不是应该都会一起删掉吗?为什么会出现上面的现象呢?这个我也没有去研究。先来解决眼前的问题

3.解决问题过程
        1)既然主键约束和索引名存在 那就先删除吧,
                  alter table tb drop constraint pk_tb 提示不能删除,drop index pk_tb也提示不能删除
                  是不是我的表还没有创建,我又执行了创建表的脚本,再执行上面两条语句 还是不行
                  给出的提示是ORA-02443: 无法删除约束条件 - 不存在的约束条件                           
       2)既然能在dba_视图里查询出来 说明主键约束索引是存在的 那怎么删除呢
                  我在网上找了好多资料  都只是说执行上面的语句就可以 有的只是说加个双引号就可以
                   可是怎样试都是提示   ORA-02443: 无法删除约束条件 - 不存在的约束条件
       3)这是我想到了一个表obj$ 这是oracle的一个基表,存放所有的对象。索引和约束应该是对象 去里面看看
              我用sys 用户登录进入果然在obj$里找到一个pk_tb的对象 这是我也来得及细看 就给删了。在这我有点草率了
               我应该先分析一下,事后我才感觉这做的有点差。删除obj$的pk_tb记录后,我看了一下dba_indexes 里面的索引
               pk_tb没有了,我高兴了 以为自己解决了呢!可是再一查dba_constraints 却发现还是有pk_tb。
               再执行
               alter table tb drop constraint pk_tb  还是提示
                                           ORA-02443: 无法删除约束条件 - 不存在的约束条件     
                该怎么办呢 ?constraint不是对象嘛 ?它不记录在obj$中嘛? 我的认知是constraint 是对象啊!
        4)在百度里找 ora-02443 也没有什么好的解决办法,在pl/sql里删除也不行 总是提示:无法删除约束条件 - 不存在的约束条件     
              难道它真的不存在嘛?(这里说明一下,我现在退出sys用户,由于是测试库 忘记了sys密码了 刚才是蒙进去了 ,
                                          刚过2分钟我就忘了 看我这记性,现在怎样也进不去了有点失败)  
              我还是分析 既然dba_的视图能显示 就肯定有表存储着这个信息呢 !那存储这个信息的表应该是什么呢?
               没有在对象表中 难道oracle 会有一个单独的表存放约束? 带着这个疑问 我用普通用户查了一下没有con开头的表啊
                  (注意,我这是用普通用户,这误导了的思路了,因为我没有sys的密码 )
            我还是在网上找资料  带着疑问过了一晚上。
         5)第二天 上班后  我又查资料还是没有解决的方法。这是我也记不住sys的密码。我登录了服务器端 该了sys的密码
             现在可以用sys登录了。结果让我又高兴又是恨:高兴是 果然有con$这个表,恨自己昨天就该去该sys密码 这样就不用
              思考了一晚上了.在con$表中还真有pk_tb这个索引 删除后 dba_constraints也就查询不出来了。

3.思考
         以上虽然是一个小问题 但是我感觉做什么事情思路很重要 希望我写的能给大家提个醒 遇到问题先理清自己的思路
           另 在oracle 里 constraint 是对象嘛? ???????                                     

阅读(7361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~