这几天做实验的时候不小心给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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/498744/viewspace-258710/