我目前正在一个项目中,我需要在特定表的几列中添加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
现在,这类功能已在难以定位的多个地方使用。那么,有什么我可以做的并且仍然保留功能定义,因为可能会有很多重大更改?
答案 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')