无法更新加密列的值

时间:2018-02-07 15:23:09

标签: sql-server tsql sql-server-2016 always-encrypted

我使用Always Encrypted来加密列中的值。我的连接字符串看起来像这样(一切正常,客户端能够解密值):

Driver={ODBC Driver 13 for SQL Server};Server=10.10.10.1\INST2;Database=test;Trusted_Connection=yes;ColumnEncryption=Enabled;

然后我尝试使用以下代码更新其中一个加密值:

ALTER PROCEDURE dbo.usp_SecurityUsers_GetDetails 
(
    @Firstname NVARCHAR(128)
)
AS
BEGIN;

UPDATE SecurityUsers
SET FirstName = @Firstname
WHERE login = 'system.export.service'

SELECT Login, FirstName, LastName
FROM SecurityUsers

END;

SP就像这样调用:

Set cmd = Server.CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = conn
    cmd.NamedParameters = True
    cmd.CommandText = "[dbo].[usp_SecurityUsers_GetDetails]"
    cmd.Parameters.Append cmd.CreateParameter("@Firstname", adLongVarWChar, adParamInput, 128, "system_text")
    cmd.CommandType = adCmdStoredProc

    Set recordSet = cmd.Execute

但是我收到以下错误:

  

[Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]加密   列/变量'@ P1'的方案不匹配。加密方案   列/变量是(encryption_type ='PLAINTEXT')和   第1行附近的表达式预期为(encryption_type =   'RANDOMIZED',encryption_algorithm_name =   'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name =   'CEK_SecurityLevelNormal',column_encryption_key_database_name =   '测试')(或更弱)。

这很奇怪,因为如果代码没有封装在存储过程中并直接在SQL Server Management Studio中执行,我可以更新字段。

此外,直接在SSMS中调用SP也可以。

编辑:

更新到.net 4.6.3不会改变任何内容。我所看到的是,如果我将连接字符串ColumnEncryption=Enabled;更改为Column Encryption Setting=Enabled;,我会得到不同的错误:

  

[Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]操作数类型   clash:ntext与使用加密的nvarchar(128)不兼容   (encryption_type ='RANDOMIZED',encryption_algorithm_name =   'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name =   'CEK_SecurityLevelNormal',column_encryption_key_database_name =   '测试')

1 个答案:

答案 0 :(得分:0)

我觉得问题一定是我试图修改数据的方式,因为我能够阅读它。它太蹩脚了。

在我的存储过程中,我有nvarchar(256)。在ASP中,我使用adLongVarChar代替adVarWChar。这个错误现在似乎更合理了:

  

列/变量“@ P1”的加密方案不匹配。

结论是能够读取加密数据并使用ADO和ODBC驱动程序对其进行修改。