如何在sql 2016中的表中插入值,其列始终是加密的?

时间:2017-06-20 15:44:06

标签: c# sql-server entity-framework always-encrypted

我使用列加密在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

3 个答案:

答案 0 :(得分:1)

要直接从SSMS将数据插入加密列,您需要将Parameterization for Always Encrypted设置为True

然而,SSMS 2016不支持此功能,因此您需要安装可以找到here的较新版本的SSMS。

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

要将数据插入指定的加密列,请在打开新查询窗口时执行以下操作:

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

enter image description here

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

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

  • Connect to Server对话框
  • 选择Options
  • 转到Additional Connection Parameters
  • 输入Column Encryption Setting = Enabled

enter image description here

答案 1 :(得分:0)

此外,您还需要在一行中声明并启动变量以使其工作

DECLARE @rvalue AS CHAR (9) = '124'; INSERT INTO .[dbo].[test] ([value], [desc]) VALUES (@rvalue'test');

答案 2 :(得分:-1)

您可以使用应用程序或通过SSMS将数据插入加密列。请参阅this article,其中介绍了如何使用存储过程将数据插入Always Encrypted列。

请查看this article,了解如何使用Always Encrypted参数化将值插入加密列。 另请参阅this article

的“始终加密的参数化”部分

This article描述了如何使用应用程序

在始终加密的列中插入值

要使用Always Encrypted with Entity Framework,请关注this article