使用安全記憶體保護區執行 Transact-SQL 陳述式
適用於: SQL Server 2019 (15.x) 與更新版本 - 僅限 Windows Azure SQL 資料庫
具有安全記憶體保護區的 Always Encrypted 可讓一些 Transact-SQL (T-SQL) 陳述式對伺服器端安全記憶體保護區中的加密資料庫資料行執行機密計算。
使用安全記憶體保護區的陳述式
下列 T-SQL 陳述式類型會利用安全記憶體保護區。
使用安全記憶體保護區的 DDL 陳述式
下列類型的資料定義語言 (DDL) 陳述式需要安全記憶體保護區。
- ALTER TABLE column_definition (Transact-SQL) 陳述式,其使用啟用記憶體保護區的金鑰觸發就地密碼編譯作業。 如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 就地設定資料行加密。
- CREATE INDEX (Transact-SQL) 和 ALTER INDEX (Transact-SQL) 陳述式,其使用隨機加密在啟用記憶體保護區的資料行中建立或更改索引。 如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 在資料行上建立及使用索引。
使用安全記憶體保護區的 DML 陳述式
下列資料操作語言 (DML) 陳述式或查詢 (其以使用隨機加密的已啟用記憶體保護區資料行為目標) 需要安全記憶體保護區:
- 安全記憶體保護區內支援使用下列一或多個 Transact-SQL 運算子的查詢:
- 比較運算子
- BETWEEN (Transact-SQL)
- IN (Transact-SQL)
- LIKE (Transact-SQL)
- DISTINCT
- 聯結 - SQL Server 2019 (15.x) 僅支援巢狀迴圈聯結。 SQL Server 2022 (16.x) 和 Azure SQL Database 支援巢狀迴圈、雜湊和合併聯結
- SELECT - ORDER BY 子句 (Transact-SQL)。 SQL Server 2022 (16.x) 和 Azure SQL Database 有支援。 SQL Server 2019 (15.x) 不支援
- SELECT - GROUP BY 子句 (Transact-SQL)。 SQL Server 2022 (16.x) 和 Azure SQL Database 有支援。 SQL Server 2019 (15.x) 不支援
- 插入、更新或刪除資料列的查詢會接著觸發在已啟用記憶體保護區的資料行索引中插入及/或移除索引鍵。 如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 在資料行上建立及使用索引
注意
只有在使用隨機加密的已啟用記憶體保護區資料行中,才支援使用記憶體保護區的索引和機密 DML 查詢作業。 不支援確定性加密。
資料庫的相容性層級應設定為 SQL Server 2022 (160) 或更高版本。
在 Azure SQL Database 和 SQL Server 2022 (16.x) 中,對字元字串資料行 (char
、nchar
) 使用記憶體保護區的機密查詢,會要求資料行使用二進位字碼指標 (_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 用戶端驅動程式的資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 開發應用程式。
- 如需支援具有記憶體保護區之 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。
- 如果您使用的是 SQL Server 和主機守護者服務 (HGS),請參閱判斷並共用 HGS 證明 URL。
- 如果您藉由 Intel SGX 記憶體保護和 Microsoft Azure 證明使用 Azure SQL Database,請參閱判斷證明原則的證明 URL。
在 SSMS 中使用記憶體保護區執行 T-SQL 陳述式的必要條件
下載最新版的 SQL Server Management Studio (SSMS)。
請務必從使用連線的查詢視窗 (其已正確設定 Always Encrypted 和證明參數) 執行陳述式。
在 [連線到伺服器] 對話方塊中指定您的伺服器名稱,選取驗證方法,然後指定認證。
選取 [選項] >>,然後選取 [連線屬性] 索引標籤。指定您的資料庫名稱。
選取 [Always Encrypted] 索引標籤。
選取 [啟用 Always Encrypted (資料行加密])。
選取 [啟用安全記憶體保護區]。
將 [通訊協定] 設定為:
- [主機守護者服務] (如果您使用的是 SQL Server)。
- [Microsoft Azure 證明] (如果您使用的是具有 Intel SGX 記憶體保護區的 Azure SQL Database)。
- [無] (如果您是使用具有 VBS 記憶體保護區的 Azure SQL Database。
指定記憶體保護區證明 URL。 當通訊協定設定為 [無] 時不適用。 例如,
https://hgs.bastion.local/Attestation
或https://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave
。選取 [連接]。
如果系統提示您啟用 Always Encrypted 的參數化查詢,請選取 [啟用]。
如需詳細資訊,請參閱針對資料庫連接啟用和停用 Always Encrypted。
在 Azure Data Studio 中使用記憶體保護區執行 T-SQL 陳述式的必要條件
建議使用的最低版本為 1.23 或更高版本。 請務必從使用已啟用 Always Encrypted 並已設定正確證明通訊協定和證明 URL 的連線其查詢視窗執行陳述式。
在 [連線] 對話方塊中,選取 [進階]。
若要針對連線啟用 Always Encrypted,請將 [Always Encrypted] 欄位設定為 [啟用]。
若要啟用安全記憶體保護區,請將 [安全記憶體保護區] 欄位設定為 [已啟用]。
指定證明通訊協定和證明 URL。
- 如果您是使用 SQL Server,請將 [證明通訊協定] 設定為 [主機守護者服務],並在 [記憶體保護區證明 URL] 欄位中輸入主機守護者服務證明 URL。
- 如果您使用 DC 系列資料庫搭配 Azure SQL 資料庫中的 Intel SGX,請將 [證明通訊協定] 設定為 [Azure 證明],輸入 [證明 URL],並在 [記憶體保護區證明 URL] 欄位中參考 Microsoft Azure 證明中的原則。
- 如果您要在 Azure SQL 資料庫中使用已啟用 VBS 記憶體保護區的資料庫,請將 [證明通訊協定] 設定為 [無]。
選取 [確定],以關閉 [進階屬性]。
如需詳細資訊,請參閱針對資料庫連接啟用和停用 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
資料行執行 Employees
和 Jobs
資料表的聯結。 此查詢會擷取其薪資在員工工作薪資範圍外的員工。
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