关于项目中 "不能创建大小为 8190 的行,该大小大于所允许的最大行大小 8060 "的处理

 

由于产品底层设计的情况,sqlserver  列设置了 可以随用户 创建自动生成

项目特殊,设置的列过多,有三四百列(通常不会过多)

数据无法正常保存,报错”不能创建大小为 8190 的行,该大小大于所允许的最大行大小 8060 “,

数据库每一列都是数据加密存储

 

第一步:怀疑了代码中sql语句过长,sql参数过多,尝试分批执行 ,依然报错

第二步:查阅相关资料得知,数据中一行的数据,如果存数据字节总大小 超过 8060 是不允许的。

因为我们的列都是 varbinary的列,又因为每一列 数据需要加密存储,尝试改为指针类型字段例如text,

考虑字段过多,同时数据过大,以及涉及到代码中字段类型处理的地方较多,最终放弃。

第三步:查阅资料尝试 重建索引,依然未成功

第三步:因为原始数据,都是数值类型,只是使用加密算法之后,每一列字节都超过70.查阅sql的内置加密函数(

SQLSERVER加密解密函数(非对称密钥 证书加密 对称密钥)

ENCRYPTBYASYMKEY() --非对称密钥

ENCRYPTBYCERT()   --证书加密

ENCRYPTBYKEY()   --对称密钥

ENCRYPTBYPASSPHRASE()  --通行短语(PassPhrase)加密

找到的相关函数 ,包括当前项目在用的短语加密,进行尝试之后,发现,加密之后的 字节都时很长,最终放弃

 

最终解决方案:自己写了一个密码表,进行数据加密解密(缩短加密之后的数据),同时算法中支持历史数据的解密,再次保存是会以新的加密方式进行保存

当然这也许是 不治本的方式,每个项目都有其历史因素,和项目本身的特殊性,综合行业情况,以及项目因素,也是一个 可以接受的解决方式了。

 

posted @ 2022-05-31 16:03  周捷Jay  阅读(163)  评论(0编辑  收藏  举报