分公司突然打电话过来,说有一种单据无法保存.
第一想法是.前后台不一致所致. 因为系统跨越时间比较长,分公司用的数据库表结构比较早. 而后来又替换了现在的前端程序,这样导致 表结构不一致,所以数据无法保存.
我先要他们把数据库导出,并把前端程序一同压缩回来.
一查,果然有问题,只是高兴之后才发现,多出来的字段,根本是可选字段,g_card 品牌字段.是后期加的.一打听,客户端的软件,也一直没有更新过. 数据库也没有更改(从告诉我不知道如何进sql*plus,可见) , 不过还是要先分析程序才行.
之前的客户端没有源代码了,只好用现在的源码,从出错提示可以判定大概位置,是在主表插入表体时出现"第一行错误无法保存". 程序其实很简单,就是 一条sql脚本.为了安全起见,我又逐一对比了前后两表的结构, 基本一致.
因为胖子,用我的脚本去清理数据,也不知道他做了些什么. 后来我发现, 脚步写的是没有问题, 对触发器的处理上且,可能不妥,因为这种清理是很变态的清理,就是通过月份来判断,把几个月前的数据备份后删除. 正常系统应该是不可以那么乱了的. 因为这样的删除是会影响很多的,象现存量呀,单据回填呀, 所以 删除的时候,我都是强行关闭所有的触发器,独立的进行删除工作. 这样处理也是没有问题的.只是原来的数据库设计的时候有些触发器建了,可能又问题,又没有删除,只是disable了. 我关闭后,使用 enable all triggers ,把那些没用的东西,也一起打开了.
所以,我尝试关闭触发器去找问题. 无功而返.
期间我发现一个问题,如果表体的数量不加,表可以保存,那么问题就落在 数量 上了. 为什么不加数量就可以呢, 我先加了一个表, 不加数量,提示保存成功,然后去修改这个表. 数据还是无法保存, 看了一加数量就无法保存.
根据这个线索,我回去查找程序,发现如果没有数量,是不保存表体的,但是表体且被保存下来, 可以说设计有点失败,也许是我不清楚他们设计的初衷,可是一个没有任何意义的表..........
接下来,我写了一条表体插入语句,提示 索引因为空间不够,无法建立. 好家伙.搞了老半天 原来是表空间 没有设置自动扩展,所以到了最大值了,数据就没法保存了. 索引空间的扩展值 表空间无法再提供了,所以...............
我接下就是打开控制台,进行表空间扩展,因为又上次脚本扩展的教训,这次学乖了. 进图形控制界面,storage manager
不想再加大原来的数据文件,我附加了一个数据文件到user_data空间.
做完这些,重新测试了一下, 可以顺利保存表了.
其实这种情况之所以会有,可能是 数据管理员 只负责开关机了.
零零星星整了一个上午, 特别是远程操作,诸多不便,不过感觉还好. 下次注意步骤 可能会快一些.