Chinaunix首页 | 论坛 | 博客
  • 博客访问: 721468
  • 博文数量: 94
  • 博客积分: 1937
  • 博客等级: 上尉
  • 技术积分: 1618
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 18:46
个人简介

专注数据库开发管理

文章分类

全部博文(94)

文章存档

2015年(1)

2014年(2)

2013年(19)

2012年(32)

2011年(10)

2010年(30)

分类: Oracle

2012-10-27 10:00:27

此篇文字主要适合以下三种情况(缺一不可)的人员观看:

1、没有备份的习惯;

2、字段不用drop用set unused;

3、删后又反悔

4、为了填坑,于是乎搜各种资料。

也就是说这种文章是为那些没事找抽型开发人员而作,另外还有一种情况:向别人炫耀下自己的能力。为防止自己不小心也抽一回,特转载如下:

 

 

可以使用 SET UNUSED 选项标记一列或者多列不可用。

使用DROP SET UNUSED 选项删除被被标记为不可用的列。

语法:

   ALTER TABLE table SET UNUSED (COLlist多个) 或者 ALTER TABLE table SET UNUSED COLUMN col单个;

   ALTER TABLE table DROP UNUSED COLUMNS;

SET UNUSED不会真地删除字段,可恢复。

如何修复被设置为UNUSED的字段,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。

创建实验表TEST_UNUSED_COLUMNS

1、

CREATE TABLE TEST_UNUSED_COLUMNS 

(

TEST_1 VARCHAR2(2),

TEST_2 VARCHAR2(2),

TEST_3 VARCHAR2(2),

TEST_4 VARCHAR2(2),

TEST_5 VARCHAR2(2)

);

INSERT INTO TEST_UNUSED_COLUMNS VALUES('A1','A2','A3','A4','A5');

INSERT INTO TEST_UNUSED_COLUMNS VALUES('B1','B2','B3','B4','B5');

INSERT INTO TEST_UNUSED_COLUMNS VALUES('C1','C2','C3','C4','C5');

COMMIT;

 

2、

SELECT * FROM TEST_UNUSED_COLUMNS;

--查询结果

TEST_1  TEST_2  TEST_3  TEST_4  TEST_5

A1      A2      A3      A4      A5

B1      B2      B3      B4      B5

C1      C2      C3      C4      C5

3、 

---设置TEST_5不可用

ALTER TABLE TEST_UNUSED_COLUMNS SET UNUSED COLUMN TEST_5;   

SELECT * FROM TEST_UNUSED_COLUMNS; 

--查询结果

TEST_1  TEST_2  TEST_3  TEST_4

A1      A2      A3      A4     

B1      B2      B3      B4      

C1      C2      C3      C4  

以下进行恢复

1、用管理员身份登录,sys、system均可

2、查找TEST_UNUSED_COLUMNS在数据库中分配的编号

SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=53916;

--查询结果

OBJ#

53916

SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=53916;

--查询结果

COL#  INTCOL#  NAME

1      1        TEST_1

2      2        TEST_2

3      3        TEST_3

4      4        TEST_4

0      5        SYS_C00005_11022820:28:45$

3、更新

UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=53916;

UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=53916;

UPDATE COL$ SET NAME='TEST_5' WHERE OBJ#=53916 AND COL#=5;

UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=53916;

 

commit;

4、重启数据库

SELECT * FROM TEST_UNUSED_COLUMNS;

--查询结果

TEST_1  TEST_2  TEST_3  TEST_4  TEST_5

A1      A2      A3      A4      A5

B1      B2      B3      B4      B5

C1      C2      C3      C4      C5

恢复完成

阅读(726) | 评论(0) | 转发(0) |
0

上一篇:Bulk Collect 用法

下一篇:SQL列转行

给主人留下些什么吧!~~