DB2 V7.3中使用ENCRYPT_AES()单步插入加密数据失败求助
单步INSERT插入AES加密数据到IBM i DB2的解决方案
环境信息
- DB2: Version 7.3 Product: DB2 UDB for AS/400 v07.03.0000 V7R3m0
- 客户端:IBM i Access Client Solutions (64-bit) Version: 1.1.8.8 Build id: 1380 2021-09-13 13:47:59,路径
C:\Users\Public\IBM\ClientSolutions\acsbundle.jar - Java环境:java.version: 11.0.11 java.vendor: AdoptOpenJDK java.home:
C:\Users\Public\IBM\ClientSolutions\Start_Programs\Windows_x86-64\jdk-11.0.11+9-jrejava.fullversion: 11.0.11+9 JRE 11 Windows 10 amd64-64-Bit Compressed References 20210421_976 OpenJ9 - b4cc246d9 OMR - 162e6f729 JCL - 7796c80419 based on jdk-11.0.11+9
问题核心
直接使用ENCRYPT_AES函数插入VARCHAR(10000) FOR BIT DATA字段时,触发错误SQL0100 Row not found for INSERT,仅能通过「先插入初始值再更新」的两步操作实现,需单步完成加密数据插入。
解决方案
可行,问题本质是ENCRYPT_AES返回的BLOB类型与目标字段的隐式转换在INSERT场景下未被DB2正确处理,以下两种方法可解决:
方法1:显式类型转换
将ENCRYPT_AES的返回值强制转换为目标字段类型:
INSERT INTO POS_CCR_SIMPLE (SIMPLE) VALUES (CAST(ENCRYPT_AES('If you can read this Request, it is decrypted.', 'key123') AS VARCHAR(10000) FOR BIT DATA));
方法2:通过虚表生成插入值
利用SYSIBM.SYSDUMMY1虚表构造SELECT语句插入,绕开VALUES子句的类型转换限制:
INSERT INTO POS_CCR_SIMPLE (SIMPLE) SELECT ENCRYPT_AES('If you can read this Request, it is decrypted.', 'key123') FROM SYSIBM.SYSDUMMY1;
验证
执行插入后,用以下语句可正常解密验证数据:
SELECT DECRYPT_CHAR(SIMPLE, 'key123') FROM POS_CCR_SIMPLE;
优化建议
如果后续加密数据长度可能接近或超过10000字节,建议将字段类型改为BLOB(10000),避免类型转换操作:
ALTER TABLE POS_CCR_SIMPLE ALTER COLUMN SIMPLE SET DATA TYPE BLOB(10000);
修改后可直接使用原始INSERT语句插入加密数据。
内容的提问来源于stack exchange,提问作者Kevin Ternes
相关产品推荐
相关产品推荐

