恢復被設定為Unused的欄位

xz43發表於2010-12-22
有時為了刪除某個大數量量表上的某個欄位,會採用先把這個欄位設定為Unused,等系統空閒時,再drop掉該欄位的方式。那假如我們不想刪除,怎樣恢復被設定為Unused的欄位咧?
 
開啟視窗1,已普通使用者連線資料庫:
SQL> create table deployee ( ID integer,NAME varchar2(10),ID_CARD varchar(20));
Table created
SQL> insert into deployee values (1,'湯小娟','32068219950223628X');;
1 row inserted
SQL> insert into deployee values (2,'鄒豔麗','32068219940801326X');;
1 row inserted
SQL> insert into deployee values (3,'郭其蒙','32068219941220410X');
1 row inserted
SQL> commit;
Commit complete
 
這個時候,開啟視窗2,透過sysdba的身份連線資料庫,檢視該表的欄位數如下:
SQL> select obj# from sys.obj$ where name=upper('deployee');
      OBJ#
----------
    189690
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         3
然後,我們在視窗1中,設定欄位Name為unused
SQL> alter table deployee set unused column NAME;
Table altered
 
此時,回到視窗2,再執行剛才的查詢,檢視該表現在的欄位數如下:
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         2
回到視窗1中,在該表中,新增同名欄位Name varchar(20);
SQL> alter table deployee add NAME varchar(20);
Table altered
 
此時,回到視窗2,再執行剛才的查詢,檢視該表現在的欄位數如下:
SQL> select cols from sys.tab$ where obj#=189690;
      COLS
----------
         3
 
回到視窗1中,開始考慮怎樣恢復名稱已被佔用的列:
SQL> select COL#,INTCOL# from sys.COL$ WHERE OBJ#=189690;
      COL#    INTCOL#
---------- ----------
         1          1
         0          2
         2          3
         3          4
SQL> update col$ set col#=intcol# where obj#=189690;
已更新 4 行。
SQL> update sys.tab$ set cols=cols+1 where obj#=189690;
已更新 1 行。
SQL> select name,col# from sys.col$ where obj#=189690;
NAME                                 COL#
------------------------------ ----------
ID                                      1
SYS_C00002_10122214:33:06$              2
ID_CARD                                 3
NAME                                    4
SQL> update sys.col$ set name='OLD_NAME' where obj#=189690 and col#=2;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select name,col# from sys.col$ where obj#=189690;
NAME                                 COL#
------------------------------ ----------
ID                                      1
OLD_NAME                                2
ID_CARD                                 3
NAME                                    4
SQL> select property from sys.col$ where obj#=189690;
  PROPERTY
----------
         0
     32800
         0
         0
SQL> update col$ set property=0 where obj#=189690;
已更新4行。
SQL> commit;
提交完成。
SQL> select property from sys.col$ where obj#=189690;
  PROPERTY
----------
         0
         0
         0
         0
SQL>
至此,修改完成,重啟資料庫即可。
 
附:
透過rename可以把原來欄位名稱還原回去。
alter table deployee rename column name to new_name;
alter table deployee rename column old_name to name;
重新命名後結構如下:
create table DEPLOYEE
(
  ID       INTEGER,
  NAME     VARCHAR2(10),
  ID_CARD  VARCHAR2(20),
  NEW_NAME VARCHAR2(20)
)
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-682384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章