Operation not allowed for reason code "7" on table报错解决
上图是我在Datagrip直接操作DB2的报错,也是同样的原因,导致不能操作实体类,登录javeweb的时候会报错
导致这种情况的原因是:
我执行sql脚本的时候,执行了一些不规范的操作,我想把字段onling_flag由int改为varchar,并修改原有表里的数据,把0或1改为‘000’,结果,修改了表数据,同时又修改的字段类型,并设为非空带默认值,直接导致表暂挂了,不建议这种写法,最好是删除字段然后重建,如果数据和原先的表数据想关联的话,比如0改为000,1改为001,可以先建一个列,叫temp,然后set temp=‘00’||online_flag,然后删除online_flag,再建一个online_flag=temp;最后删除temp,就达到效果了。
解决办法:
执行这两句
CALLSYSPROC.ADMIN_CMD('reorgtableOP_TABLE');
CALLSYSPROC.ADMIN_CMD('runstatsontableOP_TABLE');
原理:
DB2中SQLSTATE=57016SQLCODE=-668,原因码 "7"的解决
对表进行任何操作都不被允许,提示SQLSTATE=57016 SQLCODE=-668 ,原因码"7"的错误:SQL0668N Operation not allowed for reason code "7" on table XXX. 解决方法为:执行命令:reorg table XXX;即可。
参考原文为:
Operation notallowed for reason code reason-code on table table-name.
Explanation: Accessto table table-name is restricted. The cause is based on the following reasoncodes reason-code: 7
The table is in the reorg pending state.This can occur after an ALTER TABLE statement containing a REORG-recommendedoperation.7
Reorganize the table using the REORG TABLEcommand (note that INPLACE REORG TABLE is not allowed for a table that is inthe reorg pending state).
其中:
reorg table <tablename> 通过重构行来消除“碎片”数据并压缩信息,对表进行重组。
runstats on table <tbschema>.<tbname> 收集表 <tbname> 的统计信息。
reorgchk on table all 确定是否需要对表进行重组,对于对所有表自动执行 runstats 很有用。
>>> reorg 和runstats 都是单个表优化,初始化的命令:
runstats on tableadministrator.test;
reorg table administrator.test;
什么时候需要runstats:
1、在给表创建一个index后,我们最好做一次runstat,否则可能index没有生效。不过有说法称在8.2版本以后的DB2中,会在INDEX之后自动进行runstats;
2、在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。
3、当表里数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。对于一些非常大的表,比方在数据仓库的项目里面,某些事实表非常巨大。这个时候,完整的对一个大表作runstats可能花费时间相当大,DB2 8.1里面支持我们对这些大表作抽样,比方说只对20%的数据作runstats,这样的话,一般来说也能保证得到正确的执行计划。当然首先要确保这个表里面的数据最好分布比较均匀。
4、当你在分区(DPF)数据库里面使用了REDISTRIBUTE DATABASE PARTITION GROUP这个命令,那么就需要用runstats来收集新的统计信息