从具有始终加密列的表中检索数据的功能的替代方法

时间:2019-03-07 12:02:05

标签: sql-server tsql asp.net-core

我目前正在一个项目中,我需要在特定表的几列中添加SQL Server的“始终加密”功能。但是我这样做很麻烦,因为那些表的相关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

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

1 个答案:

答案 0 :(得分:0)

不幸的是,您所要求的根本无法完成。
如果能够做到的话,它将违反始终加密功能的主要原理-将数据的加密/解密与数据库本身分开。

摘自Always Encrypted (Database Engine)文档:

  

始终加密允许客户端在客户端应用程序内部加密敏感数据,而从不向数据库引擎(SQL数据库或SQL Server)公开加密密钥。结果,“始终加密”将拥有数据(并可以查看数据)的人和管理数据(但不应具有访问权限)的人分开。通过确保本地数据库管理员,云数据库操作员或其他高特权但未经授权的用户无法访问加密数据,Always Encrypted使客户可以放心地存储敏感数据,而不受其直接控制。

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

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