内存优化表+加密和标识列

时间:2017-04-21 08:31:47

标签: sql-server azure-sql-database always-encrypted

我想知道是否可以使用始终加密的Memory Optimized Table并且还可以自动播种主键?例如,我想创建以下内容:

CREATE TABLE Foo
(
    [Id] [int] Identity(1,1) NOT NULL,
    [Bar] NVARCHAR(MAX) NOT NULL,
    CONSTRAINT [PK_Foo] PRIMARY KEY NONCLUSTERED ([Id] ASC)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
GO

相当简单的表,并且最初创建正常但是,当我尝试加密列Bar时,我得到以下异常。

  

2017年4月21日09:23:00 [错误] WorkitemExecution:消息:内心   异常:System.Data.SqlClient.SqlException Details:无法插入   表格中的标识列的显式值' Foo'当IDENTITY_INSERT   设置为OFF ..

我也尝试在创建表语句后设置SET IDENTITY_INSERT Foo ON,但仍然没有运气。

阅读文档并不能表明这是不可能的,但也许我错过了什么?如果这不可能,我会采用另一种方法,我知道这种方法可行。

我想我总结的问题是.. "内存优化表支持始终使用标识列" 进行加密。

2 个答案:

答案 0 :(得分:2)

您无法使用“始终加密”加密标识列,无论它们是存储在内存优化表还是常规表中。在常规的始终加密查询处理流程中,插入到加密列中的值将在客户端创建和加密。请注意,只有客户端具有加密密钥,并且可以加密/解密数据。根据设计,SQL Server无法访问加密密钥,也无法执行加密操作.Identity列值是在服务器端生成的,因此它们不适合上述工作流程。

理解为什么要尝试加密您的标识列会很有用。 Always Encrypted旨在用于保护敏感数据。自动生成的标识符通常不被视为敏感信息。

谢谢,

的Jakub

答案 1 :(得分:1)

即使您通过向导加密失败,也应该为您创建CMK和CEK。您可以通过浏览到YourDb来检查创建的CEK的名称 - >安全 - >始终加密密钥 - > SSMS对象资源管理器中的列加密密钥。在我的例子中,CEK的名称是CEK_Auto1

如果您发现上述位置没有列加密密钥,您可以按照配置列主密钥(新列主密钥)和配置列加密密钥(新列加密密钥)中列出的步骤创建新密钥。在this article

您应该能够按如下方式创建表格

CREATE TABLE Foo
(
    [Id] [int] Identity(1,1) NOT NULL,
    [Bar] NVARCHAR(MAX) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    CONSTRAINT [PK_Foo] PRIMARY KEY NONCLUSTERED ([Id] ASC)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
GO