SQL Server索引解密列的视图
Posted
技术标签:
【中文标题】SQL Server索引解密列的视图【英文标题】:SQL Server Indexing a View that decrypts a column 【发布时间】:2014-07-30 21:00:30 【问题描述】:我目前正在尝试为我的视图编制索引,因此查询时间不会太长。为简化起见,我将举一个我的设置示例。
我目前有一个Person
表。在人员表中,我存储了一个人的加密birthdate
(存储为varbinary
)等等。我还创建了一个名为vPerson
的视图,它解密了该列并将其显示为正常日期。作为参考,我在这样的select语句中解密birthdate
..
CAST(DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('NameOfKey'), NULL, BirthDateEncrypted) AS DATE) AS BirthDate
我必须使用DecryptByKeyAutoAsymKey
,因为它不需要您打开密钥来使用它(因为视图只是第一个选择查询)。这本身就可以正常工作,但是一旦我尝试使用代码为视图创建索引..
CREATE CLUSTERED INDEX Idx_vPerson ON dbo.vPerson (PersonID);
它给了我这个错误..
无法在视图“_.dbo.vPerson”上创建索引。函数“AsymKey_Id”产生不确定的结果。使用确定性系统函数,或修改用户定义的函数以返回确定性结果。
我很困惑,因为我相信它是一个确定性函数,因为它总是返回一个int
。如果我悬停,它甚至会说它返回一个int
。也许我只是对整个过程有误解,但如果有人能启发我或提供一些见解,我将非常感激!
【问题讨论】:
如果您创建一个自动解密数据的视图,为什么还要加密数据呢?这几乎违背了目的,不是吗? 嗯,出生日期在数据库中使用基于服务主密钥的密钥进行加密。 AKA,如果有人以某种方式获得了数据库的备份副本,则除非他们还获得服务主密钥,否则无法读取它。编辑:为了澄清,服务主密钥特定于 SQL Server 的实例,而数据库主密钥特定于数据库。备份数据库时,它不携带服务主密钥,但携带数据库主密钥、非对称密钥等。 如果你看at the MSDN documentation forDecryptByKeyAutoAsymKey
,它明确指出返回类型是varbinary
,最大大小为8000字节。
解密函数可以,但是函数 AsymKey_Id(sql 似乎从错误中抱怨)返回和 int。虽然它们都是非确定性的。我在这个问题中的问题是我没有完全理解确定性和非确定性函数。
【参考方案1】:
DecryptByKeyAutoAsymKey
不是确定性的,因为它在使用相同的参数调用时并不总是返回相同的结果。那是因为您可以重新配置密钥NameOfKey
。索引视图需要确定性函数。
如果有人以某种方式获得了数据库的备份副本,则除非他们还获得服务主密钥,否则无法读取它。
这使得函数具有不确定性。
实际上,可以在没有任何键的情况下从索引中提取数据。一个数据库备份就足够了。
【讨论】:
以上是关于SQL Server索引解密列的视图的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 R2 和索引视图中的执行计划
包含列的 SQL Server 索引 - 转换为 Oracle
[转帖]SQL Server 索引中include的魅力(具有包含性列的索引)