使用安全記憶體保護區執行 Transact-SQL 陳述式

適用於:SQL Server 2019 (15.x) 和更新版本 - 僅限 Windows Azure SQL Database

具有安全記憶體保護區的 Always Encrypted 可讓一些 Transact-SQL (T-SQL) 陳述式對伺服器端安全記憶體保護區中的加密資料庫資料行執行機密計算。

使用安全記憶體保護區的陳述式

下列 T-SQL 陳述式類型會利用安全記憶體保護區。

使用安全記憶體保護區的 DDL 陳述式

下列類型的資料定義語言 (DDL) 陳述式需要安全記憶體保護區。

使用安全記憶體保護區的 DML 陳述式

下列資料操作語言 (DML) 陳述式或查詢 (其以使用隨機加密的已啟用記憶體保護區資料行為目標) 需要安全記憶體保護區:

注意

只有在使用隨機加密的已啟用記憶體保護區資料行中,才支援使用記憶體保護區的索引和機密 DML 查詢作業。 不支援確定性加密。

資料庫的相容性層級應設定為 SQL Server 2022 (160) 或更高版本。

在 Azure SQL Database 和 SQL Server 2022 (16.x) 中,對字元字串資料行 (charnchar) 使用記憶體保護區的機密查詢,會要求資料行使用二進位字碼指標 (_BIN2) 定序或 UTF-8 定序。 在 SQL Server 2019 (15.x) 中,需要 a_BIN2 定序。

使用安全記憶體保護區的 DBCC 命令

如果資料庫在使用隨機加密的已啟用記憶體保護區資料行中有索引,則會檢查索引完整性的 DBCC (Transact-SQL) 系統管理命令也可能需要安全記憶體保護區。 例如,DBCC CHECKDB (Transact-SQL)DBCC CHECKTABLE (Transact-SQL)

使用安全記憶體保護區執行陳述式的必要條件

您的環境必須符合下列需求才能支援執行使用安全記憶體保護區的陳述式。

  • SQL Server 執行個體或 Azure SQL Database 中的資料庫伺服器必須正確設定為支援適用/需要時的記憶體保護區和證明。 如需詳細資訊,請參閱設定安全記憶體保護區和證明

  • 當您從應用程式或工具 (例如 SQL Server Management Studio) 連線至資料庫時,請務必:

    • 使用支援具有安全記憶體保護區之 Always Encrypted 的用戶端驅動程式版本或工具版本。

    • 為資料庫連線啟用 Always Encrypted。

    • 指定證明通訊協定,判斷您的應用程式或工具是否必須在提交記憶體保護區查詢之前證明記憶體保護區,以及應該使用哪個證明服務。 大部分的工具和驅動程式都支援以下證明通訊協定:

      • Microsoft Azure 證明 - 強制證明使用 Microsoft Azure 證明。
      • 主機守護者服務 - 強制證明使用主機守護者服務。
      • 無 - 允許在沒有證明的情況下使用記憶體保護區。

      下表指定特定 SQL 產品和記憶體保護區技術適用的證明通訊協定:

      產品 記憶體保護區技術 支援的證明通訊協定
      SQL Server 2019 (15.x) 和更新版本 VBS 記憶體保護區 主機守護者服務,無
      Azure SQL Database SGX 記憶體保護區 (DC 系列資料庫中) Microsoft Azure 證明
      Azure SQL Database VBS 記憶體保護區
  • 如果您使用證明,請指定對您環境有效的證明 URL。

在 SSMS 中使用記憶體保護區執行 T-SQL 陳述式的必要條件

下載最新版的 SQL Server Management Studio (SSMS)

請務必從使用連線的查詢視窗 (其已正確設定 Always Encrypted 和證明參數) 執行陳述式。

  1. 在 [連線到伺服器] 對話方塊中指定您的伺服器名稱,選取驗證方法,然後指定認證。

  2. 選取 [選項] >>,然後選取 [連線屬性] 索引標籤。指定您的資料庫名稱。

  3. 選取 [Always Encrypted] 索引標籤。

  4. 選取 [啟用 Always Encrypted (資料行加密])。

  5. 選取 [啟用安全記憶體保護區]。

  6. 將 [通訊協定] 設定為:

    1. [主機守護者服務] (如果您使用的是 SQL Server)。
    2. [Microsoft Azure 證明] (如果您使用的是具有 Intel SGX 記憶體保護區的 Azure SQL Database)。
    3. [無] (如果您是使用具有 VBS 記憶體保護區的 Azure SQL Database。
  7. 指定記憶體保護區證明 URL。 當通訊協定設定為 [無] 時不適用。 例如,https://hgs.bastion.local/Attestationhttps://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave

    Connect to server with attestation using SSMS

  8. 選取 [連接]。

  9. 如果系統提示您啟用 Always Encrypted 的參數化查詢,請選取 [啟用]。

如需詳細資訊,請參閱針對資料庫連接啟用和停用 Always Encrypted

在 Azure Data Studio 中使用記憶體保護區執行 T-SQL 陳述式的必要條件

建議使用的最低版本為 1.23 或更高版本。 請務必從使用已啟用 Always Encrypted 並已設定正確證明通訊協定和證明 URL 的連線其查詢視窗執行陳述式。

  1. 在 [連線] 對話方塊中,選取 [進階]。

  2. 若要針對連線啟用 Always Encrypted,請將 [Always Encrypted] 欄位設定為 [啟用]。

  3. 若要啟用安全記憶體保護區,請將 [安全記憶體保護區] 欄位設定為 [已啟用]

  4. 指定證明通訊協定和證明 URL。

    • 如果您是使用 SQL Server,請將 [證明通訊協定] 設定為 [主機守護者服務],並在 [記憶體保護區證明 URL] 欄位中輸入主機守護者服務證明 URL。
    • 如果您使用 DC 系列資料庫搭配 Azure SQL 資料庫中的 Intel SGX,請將 [證明通訊協定] 設定為 [Azure 證明],輸入 [證明 URL],並在 [記憶體保護區證明 URL] 欄位中參考 Microsoft Azure 證明中的原則。
    • 如果您要在 Azure SQL 資料庫中使用已啟用 VBS 記憶體保護區的資料庫,請將 [證明通訊協定] 設定為 [無]

    Connect to server with attestation using Azure Data Studio

  5. 選取 [確定],以關閉 [進階屬性]。

如需詳細資訊,請參閱針對資料庫連接啟用和停用 Always Encrypted

如果打算執行參數化的 DML 查詢,則必須同時啟用 Always Encrypted 的參數化

範例

本節包含使用記憶體保護區的 DML 查詢範例。

這些範例使用以下結構描述。

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Jobs](
 [JobID] [int] IDENTITY(1,1) PRIMARY KEY,
 [JobTitle] [nvarchar](50) NOT NULL,
 [MinSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [MaxSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
);
GO

CREATE TABLE [HR].[Employees](
 [EmployeeID] [int] IDENTITY(1,1) PRIMARY KEY,
 [SSN] [char](11) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [FirstName] [nvarchar](50) NOT NULL,
 [LastName] [nvarchar](50) NOT NULL,
 [Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [JobID] [int] NULL,
 FOREIGN KEY (JobID) REFERENCES [HR].[Jobs] (JobID)
);
GO

以下查詢會對加密的 SSN 字串資料行執行完全相符搜尋。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

以下查詢會對加密的 SSN 字串資料行執行模式比對搜尋,搜尋其社會安全號碼特定末幾碼的員工。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

範圍比較

以下查詢會對加密的 Salary 資料行執行範圍比較,搜尋其薪資在指定範圍內的員工。

DECLARE @MinSalary money = 40000;
DECLARE @MaxSalary money = 45000;
SELECT * FROM [HR].[Employees] WHERE [Salary] > @MinSalary AND [Salary] < @MaxSalary;
GO

聯結

以下查詢會使用加密的 Salary 資料行執行 EmployeesJobs 資料表的聯結。 此查詢會擷取其薪資在員工工作薪資範圍外的員工。

SELECT * FROM [HR].[Employees] e
JOIN [HR].[Jobs] j
ON e.[JobID] = j.[JobID] AND e.[Salary] > j.[MaxSalary] OR e.[Salary] < j.[MinSalary];
GO

排序

下列查詢會根據加密的 Salary 資料行排序員工記錄,擷取薪資最高的 10 名員工。

注意

SQL Server 2022 (16.x) 和 Azure SQL Database 支援排序加密資料行,但 SQL Server 2019 (15.x) 則否。

SELECT TOP(10) * FROM [HR].[Employees]
ORDER BY [Salary] DESC;
GO

下一步

另請參閱