不使用身份规范自动执行顺序整数ID?

时间:2019-02-25 05:41:25

标签: concurrency sql-server-2012 auto-increment database-trigger

是否有使用SQL Server的内置身份规范管理无序管理自己的连续整数字段的尝试/正确方法?我认为这已经完成了很多遍了,而我的Google技能今晚让我失望了。

我的第一个想法是使用单独的表来管理ID,并使用目标表上的触发器来管理ID的设置。并发问题显然很重要,但是在这种情况下,插入性能并不重要。

这是我需要注意的一些陷阱:

  • 需要确保同一ID在以下情况下不被分发超过一次 多个进程同时运行。
  • 需要确保对1)的任何解决方案都不会导致死锁
  • 需要确保在有多个记录时触发器能够正常工作 插入单个语句中;不仅一次只记录一次。
  • 需要确保触发器仅在尚未设置ID的情况下进行设置 指定。

最后一个要点的原因(以及我想首先在没有“身份规范”字段的情况下执行此操作的全部原因)是因为我想在不同的起点播种多个环境,并且希望能够复制它们每个之间的数据,以便给定记录的ID在环境之间保持相同(并且我必须使用整数;我不能使用GUID)。

(也是,我可以将身份插入设置为开/关以复制数据,并且仍然使用常规的身份规范字段,但是每次插入后它都会重新设置种子。我可以然后使用DBCC CHECKIDENT重新设置种子它回到了原来的位置,但是我觉得这种解决方案的风险太大了,只需要花费一个人犯错的时间,然后当我们意识到这一点时,修复数据就会非常痛苦。也许足够痛苦,以至于仅仅要做我现在正在做的事情就更有意义了。

1 个答案:

答案 0 :(得分:1)

SQL Server 2012引入了SEQUENCE数据库对象的概念-类似于“身份”列,但与表分开。

您可以从代码中创建和使用序列,可以在各个位置使用值,甚至更多。

有关更多信息,请参见以下链接: