【发布时间】: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 for
DecryptByKeyAutoAsymKey,它明确指出返回类型是varbinary,最大大小为8000字节。 -
解密函数可以,但是函数 AsymKey_Id(sql 似乎从错误中抱怨)返回和 int。虽然它们都是非确定性的。我在这个问题中的问题是我没有完全理解确定性和非确定性函数。
标签: sql sql-server encryption view indexing