从具有始终加密列的表中进行数据检索的替代函数

问题描述 投票:0回答:1

我目前正在开发一个项目,我需要将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-server tsql asp.net-core
1个回答
0
投票

不幸的是,你要求的东西根本无法完成。 如果可以,它将违反始终加密功能的主要原则 - 即数据加密/解密与数据库本身的分离。

来自Always Encrypted (Database Engine)文档:

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

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

SELECT *
FROM sys.dm_sql_referencing_entities('dbo.TestApplicantFunc', 'OBJECT')
© www.soinside.com 2019 - 2024. All rights reserved.