首页 > 解决方案 > 从具有始终加密列的表中检索数据的函数的替代方法

问题描述

我目前正在做一个项目,我需要将 SQL Server 的 Always Encrypted 功能添加到特定表的几列中。但是我在这样做时遇到了麻烦,因为这些表的相关 SQL 函数无法使用更新的表的加密元数据进行刷新。发生这种情况是因为 SQL 函数返回的临时表具有未加密的列,该列对应于表的加密列。一个这样的函数示例是这样的,其中 LastName 列被加密 -

CREATE FUNCTION TestApplicantFunc 
(
   @Id [bigint]
)
RETURNS 
@TestTable TABLE 
(
   LastName [nvarchar](32)
)
AS
BEGIN
   INSERT INTO @TestTable(LastName)

   SELECT a.LastName FROM dbo.EncryptedTable as a
   WHERE a.ID = @Id
   RETURN 
END
GO

现在这类功能已经在多个难以定位的地方使用。那么,有什么我可以做的并且仍然保留函数定义,因为可能会有很多重大更改?

标签: sql-servertsqlasp.net-core

解决方案


不幸的是,您所要求的根本无法完成。
如果可以做到,那将违反始终加密特性的主要原则——即数据的加密/解密与数据库本身的分离。

始终加密(数据库引擎)文档:

Always Encrypted 允许客户端加密客户端应用程序内的敏感数据,并且永远不会向数据库引擎(SQL 数据库或 SQL Server)泄露加密密钥。因此,Always Encrypted 将拥有数据(并且可以查看数据)和管理数据(但不应访问)的人分开。通过确保本地数据库管理员、云数据库操作员或其他高权限但未经授权的用户无法访问加密数据,Always Encrypted 使客户能够自信地存储敏感数据,不受其直接控制。

但是,您只需从内置的表值函数中选择即可找到该函数的使用位置sys.dm_sql_referencing_entities

SELECT *
FROM sys.dm_sql_referencing_entities('dbo.TestApplicantFunc', 'OBJECT')

推荐阅读