在“好日子”中,我使用了Sybase的SQL Anywhere数据库。它具有避免多个用户创建新记录时发生冲突的功能:存在一个单独的键值表,该表将用于向客户端应用程序分发唯一键块,以供后续插入其他表时使用。当客户端的密钥池变低时,客户端从服务器请求另一个密钥块。键可以特定于单个表(即每个表都有其自己的键池),也可以在表之间“共享”键,使得INSERT INTO Table1
可以使用Key=100
,而后面的INSERT INTO Table2
将使用Key=101
。
此键池的好处是,在客户端分配的主键还可以用作在其他表中创建插入的外键-全部在客户端,如果用户最终放弃了新的操作,则无需先提交事务数据。
我一直在寻找类似的功能,但似乎只发现数据库复制和镜像,而没有关于密钥表的任何信息。
我们正在使用一个共享数据库和多个运行VB.NET应用程序的客户端来进行数据访问和创建。
我想到的基本表如下:
CREATE TABLE [KeyPool] (
[KeyNo] [int] IDENTITY PRIMARY KEY NOT NULL,
[AssignedTo] [varchar](50) NULL,
[Status] [nchar](10) NULL,
[LastTouched] [datetime2] NULL,
)
如果需要进行垃圾收集,那么Status和LastTouched列将允许恢复“丢失的键”,但实际上并不是必需的。实际上,仅具有存储向客户提供的最后一个密钥值的单行将是最低要求:只需在请求时以1000个块的形式分发密钥,然后递增计数器以知道接下来要分发的块。但是,如果没有用于跟踪谁拥有哪些键的表,就会有很多“浪费”的键值(根据数据库中预期的潜在记录数,这可能是问题,也可能不是问题)。
在外出并重复创建自己的解决方案的工作之前,我正在SQL Server中寻找任何“标准”方法。
答案 0 :(得分:0)
使用Sequence对象。您可以在默认值或查询中使用“ NEXT VALUE FOR”,也可以使用sp_sequence_get_range向客户端请求密钥块。