无法更新加密列的值
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 驱动程序对其进行修改。
我使用 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 驱动程序对其进行修改。