【原創】通過資料字典操作刪除表的列

木頭一個發表於2008-05-03

這幾天做實驗的時候不小心給dual表新增了一列,造成了資料庫所用的drop操作都不能執行了,而sys使用者下的表是不能通過alter table ... drop column ... 刪除列,最後通過其他方式解決了,請參考:http://space.itpub.net/498744/viewspace-258714。但實際上也可以通過下面的方法直接刪除列(主要是操作col$和tab$資料字典表)

注意:一定不要在生產資料庫嘗試下面的操作,要不然就算黎叔不生氣,後果照樣很嚴重

實驗環境:WinXP SP2
資料庫版本:10.2.0.1

具體步驟如下:

1.建立實驗表test,包行a和b兩列

sys@TEST>create table test
  2  (a number,
  3  b number);

Table created.

2.檢視col$資料字典表中test表的記錄

sys@TEST>select obj#,name from col$ where obj# in  (select object_id from dba_objects where object_name='TEST');

      OBJ# NAME
---------- ------------------------------
     61201 A
     61201 B

3.刪除test表的中b列

sys@TEST>delete col$ where obj#=61201 and name='B';

1 row deleted.

sys@TEST>commit;

Commit complete.

4.檢視tab$資料字典表中test表的記錄。可以看到tab$中記錄了表的列數

sys@TEST>select cols,intcols,kernelcols from tab$ where obj#=61201;

      COLS    INTCOLS KERNELCOLS
---------- ---------- ----------
         2          2          2

5.將test表的列數改為1

sys@TEST>update tab$ set cols=1,intcols=1,kernelcols=1 where obj#=61201;

1 row updated.

sys@TEST>commit;

Commit complete.

6.desc test表依舊有兩列,改動沒有成功?這是因為資料字典表是在資料庫啟動的時候載入的,重啟資料庫就可以了

sys@TEST>desc test
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- --------------------------
 A                                                              NUMBER
 B                                                              NUMBER

7.重啟資料庫

sys@TEST>shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

sys@TEST>startup
ORACLE instance started.

Total System Global Area  268435456 bytes
Fixed Size                  1248504 bytes
Variable Size             125829896 bytes
Database Buffers          134217728 bytes
Redo Buffers                7139328 bytes
Database mounted.
Database opened.

8.修改完成,可以看到test表只有一列了


sys@TEST>desc test
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- -------------------------
 A                                                              NUMBER

 

這個實驗只是刪除表的一列,實際上對列改名、新增列、刪除表等操作也是可以類似的完成的,主要就是操作col$、tab$、obj$三張資料字典表表

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

相關文章