无法更新加密列的值

Not possible to update value of encrypted column

我使用 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][ODBC Driver 13 for SQL Server][SQL Server]Encryption scheme mismatch for columns/variables '@P1'. The encryption scheme for the columns/variables is (encryption_type = 'PLAINTEXT') and the expression near line '1' expects it to be (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_SecurityLevelNormal', column_encryption_key_database_name = 'test') (or weaker).

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

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

编辑:

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

[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Operand type clash: ntext is incompatible with nvarchar(128) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_SecurityLevelNormal', column_encryption_key_database_name = 'test')

我觉得问题一定出在我试图修改数据的方式上,因为我能够读取它。而且太蹩脚了。

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

Encryption scheme mismatch for columns/variables '@P1'.


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