考虑到 SQL Azure 联合不支持 IDENTITY 属性或序列,在插入记录时生成序列号的有效方法是什么?
例如,给定一个包含这些列的表:
CREATE TABLE [dbo].[Orders] (
[TenantId] [uniqueidentifier] NOT NULL,
[OrderId] [uniqueidentifier] NOT NULL,
[OrderNumber] [int] NOT NULL
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
[TenantId] ASC,
[OrderId] ASC
)
) FEDERATED ON ([FederationKey] = [TenantId])
对于为给定租户插入的每个订单,OrderId 应递增。例如,对于租户 A,OrderId 将是 1、2、3...,而对于租户 B,OrderId 也将是 1、2、3...,按独立顺序排列。理想情况下应该没有间隙。
TenantId 和 OrderId 是主键的组成部分。它们的值由应用程序设置,与生成序列的问题无关;只有 OrderId 有具有业务意义的序号。此外,TenantId 是联邦的分发密钥。
这篇 MSDN 博客文章在选项 1 中描述了一种方法,即拥有一个保存序列的表并在隔离事务中使用存储过程来增加序列。每个租户都会在此表上拥有一条记录,其中包含序列的最后使用值。
考虑到可扩展性、争用、资源锁定,这是否是最佳方法?考虑到 SQL Azure 联合的限制,还有其他有用的技巧吗?