我想知道是否可以使用始终加密的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
,但仍然没有运气。
阅读文档并不能表明这是不可能的,但也许我错过了什么?如果这不可能,我会采用另一种方法,我知道这种方法可行。
我想我总结的问题是.. "内存优化表支持始终使用标识列" 进行加密。
答案 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