如何将值插入到 sql 2016 中列始终加密的表中?

use*_*287 5 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
Run Code Online (Sandbox Code Playgroud)

Son*_*u K 4

为了将数据直接从 SSMS 插入加密列,您需要设置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

在此输入图像描述