我正在使用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值的方法吗?
答案 0 :(得分:0)
您需要利用Parameterization for Always Encrypted columns。您必须了解,使用AE列,服务器没有加密密钥,因此它不可能插入在批处理脚本中声明的值。值必须必须由具有加密密钥的客户端加密。
对于SQL Server 2017,始终加密列参数化是可能,请参见链接的文章。但是它仅在某些条件下有效。而且它绝对不能在SQL Server 2016中工作。
与大多数“始终加密”列用例一样,从客户端发送值会更好。