【问题标题】:SQL Server 2017 Always Encrypted issue when joining on temp table加入临时表时 SQL Server 2017 始终加密问题
【发布时间】: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


    【解决方案1】:

    我在微软论坛上发布了同样的问题,我得到了一个很好的答案:https://learn.microsoft.com/en-us/answers/questions/1023525/sql-server-2017-always-encrypted-issue-when-joinin.html

    基本上, sp_describe_parameter_encryption 无法正确分析查询,因为临时表不存在。这与表变量不同,因为表变量是已声明的实体。使这项工作的诀窍是执行以下操作:

    CREATE TABLE #AvailablePatients (
        PatientID INT NOT NULL
        PRIMARY KEY (PatientID)
    )
    
    EXEC sp_describe_parameter_encryption
        N'
            SELECT [SSN], Patients.[FirstName], Patients.[LastName], [BirthDate] 
            FROM Patients
            INNER JOIN #AvailablePatients ON #AvailablePatients.PatientID =  Patients.PatientID
            WHERE SSN=@SSN',
        N'
            @SSN char(11)'
    
    DROP TABLE #AvailablePatients
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2022-01-13
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多