Bry*_*ner 3 sql filesystems primary-key
我们有一个应用程序将其数据存储在SQL Server中.每个表都有一个bigint主键.我们过去只是按需生成这些,即当你去插入一个新行时,你首先调用生成下一个ID,然后你进行插入.
我们添加了对在脱机模式下运行的支持:如果连接断开(或SQL Server已关闭),它会将数据保存到本地文件,直到您重新联机,然后同步您从那时起所做的所有事情.
这需要能够在客户端生成ID.它不是要求SQL提供下一个ID,而是要求下一百或者千或10,000个ID,然后在本地存储该范围,因此在10,000个用完之前不需要更多.它实际上会将它们放在较小的块中,所以当5000用完时,它仍然有5000的缓冲区,它可以要求5000多个.
问题是,一旦上线,我们就开始收到主要密钥违规的报告.我们将数据存储在Windows注册表中的HKEY_CURRENT_USER中(保证用户可以写入的注册表中唯一的位置).因此,经过一些研究,我们发现HKEY_CURRENT_USER是漫游配置文件的一部分,因此ID可能会被旧版本覆盖.特别是如果用户同时登录网络上的多台计算机.
因此,我们重新编写了生成ID的部分,以便从用户的"Local Settings"目录中读取/写入文件.当然不应该被旧版本覆盖.但即使是现在,我仍然偶尔会看到主键违规.在这种情况下,我们唯一可以做的就是删除文件中的任何键,将用户踢出应用程序,并且在获得新的ID范围之前不要让它们重新进入.
但如果"本地设置"不安全,会是什么?是否有任何地方可以在计算机上存储持久值,保证不会回滚到旧版本?任何人都可以解释为什么"本地设置"不符合此标准?
我已经对GUID这样的解决方案做了一些考虑,但这本身就存在问题.