修复被设置为unused的字段

1.
create table copy_emp
as
select * from emp;
---复制表和数据的的方法

2.
alter table copy_emp
  set unused(ename);
3.
conn sys as sysdba;---使用sys用户

4.
SELECT OBJ# FROM OBJ$ WHERE NAME='COPY_EMP';
---表明必须大写

5.
SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=52646;----为上一句的结果

6.
UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=52646;-----把标为0的COL#值改为与INTCOL#一致

7.
UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=52646;----把字段的个数加1,就是把去掉的字段在加上

8.
UPDATE COL$ SET NAME='ENAME' WHERE OBJ#=52646 AND COL#=2;
---说明 B是字段名 2是第二个字段,通过5.可以看出unused的是第几个字段。

9.
UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=52646;-----正常表字段的PROPERTY=0;

10.
commit;

11.
shutdown immediate;

12.
startup;

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

如何修复被设置为UNUSED的字段,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。
1、创建实验表TTTA
SQL> CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
表已创建。
SQL> INSERT INTO TTTA VALUES (1,2,'3',4);
已创建 1 行。
SQL> INSERT INTO TTTA VALUES (2,3,'4',5);
已创建 1 行。
SQL> COMMIT;
提交完成。
ALTER TABLE TTTA SET UNUSED COLUMN C;        将ttta表中的C字段设置成不可用的
2、以下进行恢复
        以管理员的身份登陆,其中的oracle是当时安装oracle10g时设置的密码
SQL> conn sys/oracle as sysdba

查找ttta在数据库中分配的编号
SQL> SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';
      OBJ#
----------
     32067
SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=32067;
      COL#    INTCOL# NAME
---------- ---------- ------------------------------
         1          1 A
         2          2 B
         0          3 SYS_C00003_08031720:09:55$   被UNUSED的字段
         3          4 D
SQL> SELECT COLS FROM TAB$ WHERE OBJ#=32067;
      COLS
----------
         3      ------字段数变为3了

SQL> UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=32067;
已更新4行。
SQL> UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=32067;
已更新 1 行。
UPDATE COL$ SET NAME='C' WHERE OBJ#=32067 AND COL#=3;
UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=32067;
SQL> COMMIT;        --提交事务,使之前所做的操作生效
3、重启数据库
SQL> SELECT * FROM SCOTT.TTTA;
         A          B C                   D
---------- ---------- ---------- ----------
         1          2 3                   4
         2          3 4                   5
恢复完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值