带有始终加密列

时间:2018-11-30 20:13:12

标签: sql sql-server tsql ssms sql-server-2016

我正在使用Azure上托管的SQL Server。我有一个名为“ ERROR”的表,该表的一个名为“ DATETIME”的列启用了始终加密功能。

CREATE TABLE [dbo].[ERROR]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DATETIME] [datetime] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
    [CODE] [varchar](10) NOT NULL,
    [MESSAGE] [varchar](500) NULL,

    CONSTRAINT [PK_ERROR] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) 

我正在运行一个存储过程,以便在另一个表中添加一行,但是如果发现错误,则使用以下语句将该错误添加到该表中:

INSERT INTO [dbo].[ERROR] ([DATETIME], [CODE], [MESSAGE])
VALUES (GETDATE(), @@ERROR, ERROR_MESSAGE())

我的问题是,当我尝试在加密列中输入GETDATE()值时,出现此错误

  

操作符类型冲突:datetime与使用以下格式加密的日期时间不兼容(encryption_type ='DETERMINISTIC',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='CEK_Auto1',column_encryption_key_database_to ='Aero

根据网上的一些建议,我在SSMS上启用了始终加密的PARAMETERIZATION FOR,并首先声明为DECLARE @RAISEDTIME DATETIME = '20181130'。在此之后,未引发任何错误并将其成功插入,但是当将GETDATE()设置为值[DECLARE @RAISEDTIME DATETIME = GETDATE()]时,出现此错误:

  

列/变量“ @RAISEDTIME”的加密方案不匹配。列/变量的加密方案为(encryption_type ='PLAINTEXT'),第'3'行附近的表达式期望它为(encryption_type ='DETERMINISTIC',encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='CEK_Base1 Aeropuerto”)(或更弱)。

我尝试使用ISO8601格式化GETDATE()值,但是出现以下相同错误。

您能推荐我一种使用此存储过程插入实际datetime值的方法吗?

1 个答案:

答案 0 :(得分:0)

您需要利用Parameterization for Always Encrypted columns。您必须了解,使用AE列,服务器没有加密密钥,因此它不可能插入在批处理脚本中声明的值。值必须必须由具有加密密钥的客户端加密。

对于SQL Server 2017,始终加密列参数化是可能,请参见链接的文章。但是它仅在某些条件下有效。而且它绝对不能在SQL Server 2016中工作。

与大多数“始终加密”列用例一样,从客户端发送值会更好