关于项目中 "不能创建大小为 8190 的行,该大小大于所允许的最大行大小 8060 "的处理
由于产品底层设计的情况,sqlserver 列设置了 可以随用户 创建自动生成
项目特殊,设置的列过多,有三四百列(通常不会过多)
数据无法正常保存,报错”不能创建大小为 8190 的行,该大小大于所允许的最大行大小 8060 “,
数据库每一列都是数据加密存储
第一步:怀疑了代码中sql语句过长,sql参数过多,尝试分批执行 ,依然报错
第二步:查阅相关资料得知,数据中一行的数据,如果存数据字节总大小 超过 8060 是不允许的。
因为我们的列都是 varbinary的列,又因为每一列 数据需要加密存储,尝试改为指针类型字段例如text,
考虑字段过多,同时数据过大,以及涉及到代码中字段类型处理的地方较多,最终放弃。
第三步:查阅资料尝试 重建索引,依然未成功
第三步:因为原始数据,都是数值类型,只是使用加密算法之后,每一列字节都超过70.查阅sql的内置加密函数(
SQLSERVER加密解密函数(非对称密钥 证书加密 对称密钥)
ENCRYPTBYASYMKEY() --非对称密钥
ENCRYPTBYCERT() --证书加密
ENCRYPTBYKEY() --对称密钥
ENCRYPTBYPASSPHRASE() --通行短语(PassPhrase)加密
)
找到的相关函数 ,包括当前项目在用的短语加密,进行尝试之后,发现,加密之后的 字节都时很长,最终放弃
最终解决方案:自己写了一个密码表,进行数据加密解密(缩短加密之后的数据),同时算法中支持历史数据的解密,再次保存是会以新的加密方式进行保存
当然这也许是 不治本的方式,每个项目都有其历史因素,和项目本身的特殊性,综合行业情况,以及项目因素,也是一个 可以接受的解决方式了。