我目前正在开发一个项目,我需要将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
现在,这种类型的功能已被用于难以定位的多个地方。那么,有什么我可以做的并且仍然保留函数定义,因为可能会有很多重大变化吗?
不幸的是,你要求的东西根本无法完成。 如果可以,它将违反始终加密功能的主要原则 - 即数据加密/解密与数据库本身的分离。
来自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')