4

我使用列加密对 sql 2016 表中的几列进行了加密。现在我想将数据插入到该表中。我尝试创建一个存储过程并使用参数执行该过程,但出现以下错误。

列/变量“@lastName”的加密方案不匹配。列/变量的加密方案是 (encryption_type = 'PLAINTEXT') 并且行 '0' 附近的表达式期望它是 (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = ' BROps_TestDB')(或更弱)。

另外,我有一个现有的应用程序,其中使用 SQL 2008 中的实体框架将值插入到表中(我们正在尝试升级到 SQl 2016 以获得始终加密功能)。那么,是否有任何标志或任何方法可以通过我们将数据插入 SQL 2016(列加密)而对我们的代码进行最小的更改?

我已经给出了示例存储过程代码和该存储过程的执行。

    CREATE PROCEDURE dbo.AddCustomer
      @CustomerID int,
      @FirstName nvarchar(25),
      @LastName nvarchar(25),
      @SIN nvarchar(11),
      @CreditCardNumber nvarchar(25),
      @EmailAddress nvarchar(50),
      @PhoneNumber nvarchar(25),
      @TerritoryID int
    AS
    BEGIN
     INSERT INTO [dbo].[Customers]
               ([CustomerID]
               ,[FirstName]
               ,[LastName]
               ,[SIN]
               ,[CreditCardNumber]
               ,[EmailAddress]
               ,[PhoneNumber]
               ,[TerritoryID])
         VALUES
               (@CustomerID,
               @FirstName,
               @LastName,
               @SIN,
               @CreditCardNumber,
               @EmailAddress,
               @PhoneNumber,
               @TerritoryID)
    END 

----------------------------------------
    DECLARE @CustomerID int,
    @FirstName nvarchar(25),
    @LastName nvarchar(25),
    @SIN nvarchar(11),
    @CreditCardNumber nvarchar(25),
    @EmailAddress nvarchar(50),
    @PhoneNumber nvarchar(25),
    @TerritoryID int
    SET @CustomerID = 1
    SET @FirstName = 'David'
    SET @LastName = 'Postlethwaite'
    SET @SIN = '12345-3-ee-3'
    SET @CreditCardNumber = '1111-1233-1231-1233'
    SET @EmailAddress = 'david@clunyweb.co.uk'
    SET @PhoneNumber = '406555'
    SET @TerritoryID = 1
    execdbo.AddCustomer @CustomerID,@FirstName,@LastName,@SIN,@CreditCardNumber,@EmailAddress,
    @PhoneNumber,@TerritoryID
4

3 回答 3

4

为了直接从 SSMS 将数据插入 Encrypted 列,您需要设置Parameterization for Always EncryptedTrue.

但是,SSMS 2016 不支持此功能,因此您需要安装更新版本的 SSMS,可在此处找到。

获得 SSMS 17.0 后,您需要在连接到实例时为您的连接启用列加密。

为了将数据插入指定的加密列,当您打开一个新的查询窗口时,请执行以下操作:

  • Query OptionsQuery菜单中选择
  • Advanced, 选择Enable Parameterization for Always Encrypted

在此处输入图像描述

现在您将能够从 SSMS 将数据直接插入到表中。

为了以纯文本形式查看加密列值,您需要Enable Column Encryption Setting. 为此,请执行以下操作:

  • Connect to Server对话框中
  • 选择Options
  • Additional Connection Parameters
  • 进入Column Encryption Setting = Enabled

在此处输入图像描述

于 2017-12-29T10:29:43.693 回答
0

您还需要在一行中声明和启动变量以使其工作

将@rvalue 声明为 CHAR (9) = '124'; 插入 .[dbo].[test] ([value], [desc]) VALUES (@rvalue'test');

于 2021-01-09T00:12:03.490 回答
-2

您可以使用应用程序或通过 SSMS 将数据插入加密列。请参阅这篇介绍如何使用存储过程将数据插入到 Always Encrypted 列的文章。

请查看本文,了解如何使用 Always Encrypted 的参数化将值插入加密列。另请查看本文的始终加密部分的参数化

本文介绍如何使用应用程序在始终加密的列中插入值

对于使用 Always Encrypted 和 Entity Framework,请按照这篇文章

于 2017-06-20T16:26:29.070 回答