2017-04-21 8 views
3

常に暗号化された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日9時23分00秒[エラー] WorkitemExecution:メッセージ:インナー 例外:System.Data.SqlClient.SqlException詳細:IDENTITY_INSERT 'はFoo' テーブルにID列の 明示的な値を挿入できません。

また、テーブル作成ステートメントの後にSET IDENTITY_INSERT Foo ONを設定しようとしましたが、まだ運がありません。

ドキュメントを読んでも、これは可能ではないと示唆されていないようですが、おそらく私は何かを見逃していますか?これが不可能な場合は、私が知る別のアプローチがあります。

私の質問は要約です。「メモリ最適化テーブルのサポートは、常にID列で暗号化されています」

答えて

2

IDENTITY列が、常に最適化された表または通常表に格納されているかどうかにかかわらず、「常に暗号化」を使用して暗号化することはできません。通常の「常に暗号化された」問合せ処理フローでは、暗号化された列に挿入された値が作成され、クライアント側で暗号化されます。クライアントだけが暗号化キーを持ち、データを暗号化/復号化できることに注意してください。 SQL Serverは仕様上、暗号化キーにアクセスできず、暗号化操作を実行できません.Identity列の値はサーバー側で生成されるため、上記のワークフローに適合しません。

ID列を暗号化しようとしている理由を理解すると便利です。 Always Encryptedは機密データを保護するために設計されています。自動生成された識別子は通常、機密情報ではないとみなされます。ウィザードを通して、あなたの暗号化が失敗した後でも

おかげで、

ヤクブ

+0

私は(暗号化されるように、私は別のフィールドを暗号化するもので暗号化ID列を意味するものではありませんでした申し訳ありませんが、次のようにテーブルを作成することができるはずです)が、テーブル内にID列が存在することがあります。たとえば、フィールドBARは暗号化されるだけです。 –

1

は、あなたはあなたのために作成したCMKとCEKを持っている必要があります。 YourDb - >セキュリティ - >常に暗号化されたキー - > SSMSオブジェクトエクスプローラの列暗号化キーを参照することによって作成されたCEKの名前を確認できます。私の場合、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