sql-server - 从具有始终加密列的表中检索数据的函数的替代方法
问题描述
我目前正在做一个项目,我需要将 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 允许客户端加密客户端应用程序内的敏感数据,并且永远不会向数据库引擎(SQL 数据库或 SQL Server)泄露加密密钥。因此,Always Encrypted 将拥有数据(并且可以查看数据)和管理数据(但不应访问)的人分开。通过确保本地数据库管理员、云数据库操作员或其他高权限但未经授权的用户无法访问加密数据,Always Encrypted 使客户能够自信地存储敏感数据,不受其直接控制。
但是,您只需从内置的表值函数中选择即可找到该函数的使用位置sys.dm_sql_referencing_entities
:
SELECT *
FROM sys.dm_sql_referencing_entities('dbo.TestApplicantFunc', 'OBJECT')
推荐阅读
- php - 我无法将 solr_php 扩展添加到 php
- php - Messenger __invoke 方法中的 Swiftmailer 不发送邮件
- android - 如何确保在解析数组时不返回重复的 JSON 数据?
- javascript - Gulp 4. browser-sync 的问题 // 以下任务没有完成:browser-sync
- java - 在 Google Play 商店发布应用程序后,如果我的应用程序依赖于 Google 登录,我该如何测试它?
- sql - 使用 SQL 查询获取要插入的 VB 变量
- tensorflow - Google Cloud ml-engine 在加载 libnccl 时失败
- ios - 如何在 iOS 上的同一设备上的应用程序之间进行自动数据共享
- suse - 在 SUSE 11 中使用 xm top 时如何按排序显示 VM 的内存
- c - x11中的覆盖窗口不断闪烁