SQL Azure フェデレーションが IDENTITY プロパティまたは SEQUENCE をサポートしていないことを考えると、レコードを挿入するときに連番を生成する効率的な方法は何でしょうか?
たとえば、次の列を持つテーブルがあるとします。
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 フェデレーションの制限を考慮して、他に役立つトリックはありますか?