【发布时间】:2022-09-27 19:29:38
【问题描述】:
我们目前正在为数据库中的某些列实施 Always Encrypted,但是在加入临时表时遇到了无法解释的限制。我们查看了 Microsoft 文档并查看了许多文章,但我们找不到关于为什么这不起作用的解释。我们使用的是 SQL 2017 的最新版本:RTM-CU31。
当我们有一个查询并且我们加入一个临时表时,SQL Server 似乎无法检测到该参数应该被加密。打电话sp_describe_parameter_encryption告诉我们 SSN 参数未加密,这是错误的:
exec sp_describe_parameter_encryption
N\'
CREATE TABLE #AvailablePatients (
PatientID INT NOT NULL
PRIMARY KEY (PatientID)
)
SELECT [SSN], Patients.[FirstName], Patients.[LastName], [BirthDate]
FROM Patients
INNER JOIN #AvailablePatients ON #AvailablePatients.PatientID = Patients.PatientID
WHERE SSN=@SSN
DROP TABLE #AvailablePatients\',
N\'
@SSN char(11)\'
如果我们删除临时表上的连接,调用sp_describe_parameter_encryption现在正确地告诉我们 SSN 参数已按应有的方式加密:
exec sp_describe_parameter_encryption
N\'
CREATE TABLE #AvailablePatients (
PatientID INT NOT NULL
PRIMARY KEY (PatientID)
)
SELECT [SSN], Patients.[FirstName], Patients.[LastName], [BirthDate]
FROM Patients
WHERE SSN=@SSN
DROP TABLE #AvailablePatients\',
N\'
@SSN char(11)\'
如果我们将临时表更改为表变量,sp_describe_parameter_encryption还告诉我们 SSN 参数已加密,因为它应该:
exec sp_describe_parameter_encryption
N\'
DECLARE @AvailablePatients TABLE (
PatientID INT NOT NULL
PRIMARY KEY (PatientID)
)
SELECT [SSN], Patients.[FirstName], Patients.[LastName], [BirthDate]
FROM Patients
INNER JOIN @AvailablePatients AS AvailablePatients ON AvailablePatients.PatientID = Patients.PatientID
WHERE SSN=@SSN\',
N\'
@SSN char(11)\'
这里是如何患者表已创建:
CREATE TABLE [dbo].[Patients](
[PatientId] [int] IDENTITY(1,1) NOT NULL,
[SSN] [char](11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [TestCek], ENCRYPTION_TYPE = Deterministic, ALGORITHM = \'AEAD_AES_256_CBC_HMAC_SHA_256\') NOT NULL,
[FirstName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[BirthDate] [date] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [TestCek], ENCRYPTION_TYPE = Randomized, ALGORITHM = \'AEAD_AES_256_CBC_HMAC_SHA_256\') NOT NULL,
PRIMARY KEY CLUSTERED ([PatientId] ASC))
我们不理解这种行为,因为这是一个简单的用例,所以发生这种情况对我们来说没有意义。正如您在上面看到的,tempdb 中没有加密列。我们正在寻找解释为什么这不起作用,以及是否有办法让临时表起作用。
标签: sql-server encryption temp-tables always-encrypted tempdb