生产数据库一直运行正常,今天要在某张大表上增加一列
| SQL>alter table SAL_t_XXXXXXX add P075 number default 0 ; alter table SAL_t_XXXXXXX add P075 number default 0 ; ORA-22586: cannot add columns to object tables SQL> |
后又执行如下语句: (注 remark2 一个未使用的列)
| SQL>alter table SAL_t_XXXXXXX drop column remark2 ; alter table SAL_t_XXXXXXX drop column remark2 ; ORA-12996: cannot drop system-generated virtual column SQL> |
失败后,尝试下面语句
| SQL> alter table SAL_t_XXXXXXX rename column Remark2 to r2 Table altered SQL> |
居然成功了!
症状基本可以这样描述了:
表 SAL_t_XXXXXXX 不能新增列,也不能删除表,但是可以修改列名.
难道是: 空间不足了,
执行下面语句
| SQL>alter table SAL_t_XXXXXXX pctfree 20 ; table altered SQL>alter table SAL_t_XXXXXXX add p075 number default 0 ; alter table SAL_t_XXXXXXX drop column remark2 ; ORA-12996: cannot drop system-generated virtual column SQL> |
问题还是存在
google 一下
找到几篇篇类似情况的贴子,
大概原因是:表做过 compress 操作,不过实在是想不起来了,先解决问题
大概通过3个方法
1.修改表为非压缩状态
2.把表改名,重建一个结构相同的表.数据导过来
3.把问题表 exp 导出,再nocomperss 导入
方法1
| SQL>alter table SAL_t_XXXXXXX move nocompress ; table altered SQL> alter table SAL_t_XXXXXXX add P075 number default 0 ; ORA-22586: cannot add columns to object tables SQL> |
失败.
方法2:(之前,手工把问题表的TR和IX等都导出来)
| SQL> create table a select * from SAL_t_XXXXXXX ; table created SQL>rename SAL_t_XXXXXXX to b ; table renamed SQL>rename b to SAL_t_XXXXXXX table renamed SQL>drop table b ; table droped SQL>-- 执行问题表的TR和IX |
编译无效对象
| SQL>alter table SAL_t_XXXXXXX add P075 number default 0 ; table altered SQL> |
第三种方法没有测试...
问题解决之