Concurrency 自动化连续整数ID而不使用标识规范?

Concurrency 自动化连续整数ID而不使用标识规范?,concurrency,sql-server-2012,auto-increment,database-trigger,Concurrency,Sql Server 2012,Auto Increment,Database Trigger,使用SQL Server的内置标识规范管理您自己的序列整数字段时,是否有任何行之有效的方法?我想这件事已经做了很多次了,今晚我的谷歌技能真是太差了 我的第一个想法是使用一个单独的表来管理ID,并在目标表上使用触发器来管理ID的设置。并发性问题显然很重要,但在这种情况下,插入性能并不重要 下面是一些我知道我需要注意的问题: 需要确保同一身份证在以下情况下不会发放多次 多个进程同时运行 需要确保1)的任何解决方案不会导致死锁 需要确保触发器在创建多个记录时正常工作 插入单个语句中;不仅仅是一次一条

使用SQL Server的内置标识规范管理您自己的序列整数字段时,是否有任何行之有效的方法?我想这件事已经做了很多次了,今晚我的谷歌技能真是太差了

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

下面是一些我知道我需要注意的问题:

  • 需要确保同一身份证在以下情况下不会发放多次 多个进程同时运行
  • 需要确保1)的任何解决方案不会导致死锁
  • 需要确保触发器在创建多个记录时正常工作 插入单个语句中;不仅仅是一次一条记录
  • 需要确保触发器仅在尚未设置ID时设置ID 指定的
最后一个要点的原因(以及我希望在没有标识规范字段的情况下执行此操作的全部原因)是因为我希望在不同的起点为多个环境播种,并且我希望能够在每个环境之间复制数据,以便给定记录的ID在环境之间保持不变(我必须使用整数;我不能使用guid)


(同样是的,我可以设置identity insert on/off以复制数据,并且仍然使用常规的identity Specification字段,但每次插入后它都会重新对其进行种子设定。然后我可以使用DBCC CHECKIDENT将其重新设定到原来的位置,但我觉得此解决方案的风险太大。某人犯错误只需一次,然后当我们lize it,修复数据将是一件非常痛苦的事情……可能已经足够痛苦了,仅仅做我现在正在做的事情就更有意义了。)

SQL Server 2012引入了
序列
数据库对象的概念—类似于“标识”列,但与表分离

您可以从代码中创建和使用序列,可以在不同的位置使用值,等等

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


哇,真不敢相信我已经7年没发现这个了。谢谢!