2017-06-20 45 views
2

我已经使用列加密在sql 2016表中加密了几列。现在我想将数据插入该表中。我试图创建一个存储过程并执行该过程的参数,但我得到以下错误。如何在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 = '[email protected]' 
    SET @PhoneNumber = '406555' 
    SET @TerritoryID = 1 
    execdbo.AddCustomer @CustomerID,@FirstName,@LastName,@SIN,@CreditCardNumber,@EmailAddress, 
    @PhoneNumber,@TerritoryID 

回答

0

您可以使用应用程序或通过SSMS将数据插入加密列。请参阅this article,其中描述了如何使用存储过程将数据插入到始终加密列中。

请查看this article,了解如何使用Always Encrypted的参数化将值插入加密列。 也期待在参数化的this article

This article始终加密部分介绍如何使用应用程序

使用始终与实体框架加密插入处于始终加密的列值,请按照this article

+0

我试图插入和使用Enti更新数据库中具有加密列的行ty框架。 你能指点我可以参考的材料吗? – user3775287

+0

请参阅此文章(https://blogs.msdn.microsoft.com/sql_pfe_blog/2016/07/19/getting-started-with-always-encrypted-part-2/)了解如何插入始终加密列使用存储过程和本文(https://blogs.msdn.microsoft.com/sqlsecurity/2015/08/27/using-always-encrypted-with-entity-framework-6/)来了解如何使用Always Encrypted与实体框架 –

0

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

但是,此功能在SSMS 2016中不受支持,所以您需要安装可以找到here的更新版本的SSMS。

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

为了将数据插入到指定的加密列,当你打开一个新的查询窗口,执行以下操作:从Query菜单

  • Advanced

    • 选择Query Options,选择Enable Parameterization for Always Encrypted

    enter image description here

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

    要以纯文本格式查看加密列值,您需要EnableColumn Encryption Setting。要做到这一点,以下几点:

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

    enter image description here

  • 相关问题