我目前正在尝试索引我的视图,因此查询时间不会太长。为简化起见,我将举例说明我的设置。
我目前有一张Person
表。在人员表中,我存储了一个人的加密birthdate
(存储为varbinary
)等。我还创建了一个名为vPerson
的视图,用于解密列并将其显示为正常日期。作为参考,我解密了select语句中的birthdate
,就像这样..
CAST(DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('NameOfKey'), NULL, BirthDateEncrypted) AS DATE) AS BirthDate
我必须使用DecryptByKeyAutoAsymKey
,因为它不需要您打开密钥来使用它(因为视图只是1选择查询)。这个工作正常,但是一旦我尝试使用代码创建视图的索引..
CREATE CLUSTERED INDEX Idx_vPerson ON dbo.vPerson (PersonID);
它给了我这个错误..
无法在视图' _ .dbo.vPerson'上创建索引。函数'AsymKey_Id'产生不确定的结果。使用确定性系统函数,或修改用户定义函数以返回确定性结果。
我很困惑,因为我相信它是一个确定性函数,因为它总是返回int
。如果我悬停,它甚至会说它返回int
。也许我只是误解了整个过程,但如果有人能够启发我或给予一些见解我会非常感激!
答案 0 :(得分:1)
DecryptByKeyAutoAsymKey
不具有确定性,因为在使用相同参数调用时,它并不总是返回相同的结果。这是因为您可以重新配置密钥NameOfKey
。索引视图需要确定性函数。
如果某人得到了数据库的备份副本,除非他们也获得服务主密钥,否则无法读取它。
这使得该函数不确定。
实际上,可以在没有任何密钥的情况下从索引中提取数据。数据库备份就足够了。