SQL Server Always Encrypted功能存储过程变量赋值加密方案不匹配问题
问题原因
Always Encrypted 特性对加密列的读写有严格的类型匹配要求:加密列的加密类型、加密密钥、算法必须和接收其值的变量配置完全一致。你当前定义的@Salesman是普通未加密变量,无法匹配FirstName字段的加密配置,因此触发加密方案不匹配报错。
解决步骤
- 首先查询
FirstName字段的加密配置,执行如下SQL:
SELECT name AS column_name, encryption_type_desc, column_encryption_key_id FROM sys.columns WHERE object_id = OBJECT_ID('CommonContacts') AND name = 'FirstName'
- 根据查询到的配置,重新定义
@Salesman变量,补充加密配置参数:
-- 以下配置参数需和你查询到的FirstName列配置完全一致 DECLARE @Salesman AS NVARCHAR (max) ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = [你实际使用的列加密密钥名称], ENCRYPTION_TYPE = DETERMINISTIC, -- 可替换为RANDOMIZED,和查询结果的encryption_type_desc一致即可 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256' ); IF @SalesmanNumber > 0 BEGIN SELECT @Salesman = FirstName FROM CommonContacts WHERE CompanyNumber = @CompanyNumber AND ContactNumber = @SalesmanNumber; END
注意事项
- 操作时需要保证数据库连接已经开启列加密支持:如果是SSMS执行,需要在连接选项的「其他参数」中添加
Column Encryption Setting=Enabled;如果是应用程序连接,需要在连接字符串中追加同样的配置项。 - 加密后的变量无法在SQL Server服务端执行拼接、模糊匹配、运算等操作,所有明文层面的处理必须在持有主密钥的客户端完成。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

