ID 列の管理
適用対象: SQL Server Azure SQL Managed Instance
このトピックでは、SQL Server で SQL Server Management Studio または Transact-SQL を使用して、ID 列を管理する方法を説明します。 サブスクライバー挿入がパブリッシャーにレプリケートされる場合、サブスクライバーとパブリッシャーに同じ ID 値が割り当てられないように、ID 列を管理する必要があります。 レプリケーションでは ID の範囲を自動的に管理することも、ID の範囲を手動で管理することもできます。 レプリケーションで使用できる ID 範囲管理オプションについては、「ID 列のレプリケート」を参照してください。
このトピックの内容
作業を開始する準備:
ID 列を管理するために使用するもの:
始める前に
推奨事項
複数のパブリケーションでテーブルをパブリッシュする場合、両方のパブリケーションに同じ ID 範囲管理オプションを指定する必要があります。 詳細については、「データとデータベース オブジェクトのパブリッシュ」の「複数のパブリケーションでのテーブルのパブリッシュ」を参照してください。
複数のテーブルで使用できる自動的に増分する番号、またはテーブルを参照せずにアプリケーションから呼び出すことができる自動的に増分する番号を作成するには、「シーケンス番号」を参照してください。
SQL Server Management Studio を使用する
出版物の新規作成ウィザードの [アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [プロパティ] タブで、ID 列の管理オプションを指定します。 このウィザードの使用の詳細については、「パブリケーションの作成」を参照してください。 パブリケーションの新規作成ウィザードで選択した内容に応じて、次の操作を行います。
[パブリケーションの種類] ページで [マージ パブリケーション] または [更新可能なサブスクリプションを含むトランザクション パブリケーション] を選択した場合は、ID 範囲の管理を自動または手動に設定します (自動 (既定値) に設定することを推奨します)。 このプロパティは、テーブルがパブリッシュされた後は変更できません。ただし、その他の関連プロパティは変更できます。
他のパブリケーションの種類を選択した場合は、ID 範囲の管理を手動に設定する必要があります。
[アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [プロパティ] タブで、ID 範囲としきい値を変更します。このダイアログ ドロップダウン リストは、[パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストから開くことができます。 このダイアログ ボックスへのアクセス方法の詳細については、「パブリケーション プロパティの表示および変更」を参照してください。
ID 列の管理オプションを指定するには
パブリッシャーが SQL Server 2005 (9.x) よりも前のバージョンのSQL Server を実行している場合は、パブリケーションの新規作成ウィザードの [パブリケーションの種類] ページで、 [統合 パブリケーション] または [更新可能なサブスクリプションを含むトランザクション パブリケーション]を選択します。
[アーティクル] ページで、ID 列があるテーブルを選択します。
[アーティクルのプロパティ]をクリックしてから、 [反転表示されたテーブル アーティクルのプロパティを設定]をクリックします。
[アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [プロパティ] タブの [ID 範囲の管理] セクションで、[ID 範囲を自動的に管理します] プロパティを [自動] または [手動] (パブリッシャーが SQL Server 2005 (9.x) 以降を実行している場合)、あるいは [True] または [False] (パブリッシャーが SQL Server 2005 (9.x) よりも前のバージョンの SQL Server を実行している場合) に設定します。
手順 4. で [自動] または [True] を選択した場合は、次の表のオプションの値を入力します。 これらの設定の使用方法の詳細については、「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。
オプション 値 説明 [パブリッシャーの範囲サイズ] 範囲サイズの整数値 (たとえば 20000)。 「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。 [サブスクライバーの範囲サイズ] 範囲サイズの整数値 (たとえば 10000)。 「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。 [範囲しきい値の割合] パーセントによるしきい値の整数値 (たとえば、90 は 90% を表します)。 ノードで使用されている ID 値全体の比率がこの値を超えると、新しい ID 範囲が割り当てられます。
注: この値の指定は必須ですが、この値を使用するのは、キュー更新サブスクリプションを使用するサブスクライバーと、 SQL Server Compact または他のエディションの SQL Server の旧バージョンを実行している統合 出版物のサブスクライバーだけです。 詳細については、「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。[次の範囲の開始値] 整数値。 読み取り専用です。 次の範囲はこの値から始まります。 たとえば、現在の範囲が 5001 ~ 6000 の場合、この値は 6001 になります。 [最大 ID 値] 整数値。 読み取り専用です。 ID 列の最大値です。 列の基本データ型によって決まります。 Increment 整数値。 読み取り専用です。 挿入のたびに ID 列の番号が増減する量。通常は 1 に設定されます。 [OK] を選択します。
テーブルがパブリッシュされた後に ID 範囲としきい値を変更するには
[パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストの [アーティクル] ページで、ID 列があるテーブルを選択します。
[アーティクルのプロパティ]をクリックしてから、 [反転表示されたテーブル アーティクルのプロパティを設定]をクリックします。
[アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [プロパティ] タブの [ID 範囲の管理] セクションで、[パブリッシャーの範囲サイズ調整]、[サブスクライバーの範囲サイズ調整]、および [範囲しきい値の割合] プロパティの 1 つ以上の値を入力します。
[OK] を選択します。
[パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストで、[OK] をクリックします。
Transact-SQL の使用
レプリケーション ストアド プロシージャを使用して、アーティクルを作成するときの ID 範囲管理オプションを指定できます。
トランザクション パブリケーションのアーティクルを定義する際に自動 ID 範囲管理を有効にするには
パブリッシャー側のパブリケーション データベースに対して、 sp_addarticleを実行します。 パブリッシュするソース テーブルに ID 列がある場合、 @identityrangemanagementoption に autoを指定し、パブリッシャーに割り当てる ID 値の範囲を @pub_identity_rangeに、各サブスクライバーに割り当てる ID 値の範囲を @identity_rangeに、新しい ID 範囲を割り当てる前に使用されていた ID 値の総数のパーセンテージを @thresholdに指定します。 アーティクルの定義の詳細については、「Define an Article」 (アーティクルの定義) を参照してください。
Note
ID 列のデータ型のサイズが、すべてのサブスクライバーに割り当てられる ID 範囲の総計をサポートできるだけの大きさであることを確認してください。
トランザクション パブリケーションのアーティクルを定義する際に自動 ID 範囲管理を無効にするには
パブリッシャー側のパブリケーション データベースに対して、 sp_addarticleを実行します。 @identityrangemanagementoption に manualを指定します。 アーティクルの定義の詳細については、「Define an Article」 (アーティクルの定義) を参照してください。
サブスクライバーの更新時に競合が発生しないように、サブスクライバーの ID アーティクル列に範囲を割り当てます。 詳細については、トピック「ID 列のレプリケート」で、手動による ID 範囲管理用に範囲を割り当てる方法に関する部分を参照してください。
マージ パブリケーションのアーティクルを定義する際の自動 ID 範囲管理を有効にするには
パブリッシャー側のパブリケーション データベースに対して、 sp_addmergearticleを実行します。 パブリッシュするソース テーブルに ID 列がある場合、 @identityrangemanagementoption に autoを指定し、サーバー サブスクリプションに割り当てる ID 値の範囲を @pub_identity_rangeに、パブリッシャーおよび各クライアント サブスクリプションに割り当てる ID 値の範囲を @identity_rangeに、新しい ID 範囲を割り当てる前に使用されていた ID 値の総数のパーセンテージを @thresholdに指定します。 いつ新しい ID 範囲が割り当てられるのかについては、「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。 アーティクルの定義の詳細については、「Define an Article」 (アーティクルの定義) を参照してください。
Note
特にサーバー サブスクリプションを使用するサブスクライバーの場合、ID 列のデータ型のサイズが、すべてのサブスクライバーに割り当てられる ID 範囲の総計をサポートできるだけの大きさであることを確認してください。
マージ パブリケーションのアーティクルを定義する際に自動 ID 範囲管理を無効にするには
パブリッシャー側のパブリケーション データベースに対して、 sp_addmergearticleを実行します。 次のいずれかの値を @identityrangemanagementoptionに指定します。
manual - サブスクライバーを更新するには、手動で ID 範囲を割り当てる必要があります。
none - パブリッシャーの ID 列は、サブスクライバーの ID 列として定義されません。
アーティクルの定義の詳細については、「Define an Article」 (アーティクルの定義) を参照してください。
サブスクライバーの更新時に競合が発生しないように、サブスクライバーの ID アーティクル列に範囲を割り当てます。
スナップショット パブリケーションまたはトランザクション パブリケーションの既存のアーティクルに対する ID 範囲管理設定を自動的に変更するには
パブリッシャー側のパブリケーション データベースに対して sp_helparticle を実行し、結果セットの identityrangemanagementoption の値を確認します。 値が 0の場合、自動 ID 範囲管理は有効ではありません。
結果セットの identityrangemanagementoption の値が 1の場合、次のようにして設定を変更します。
割り当てられている ID 範囲を変更するには、パブリッシャー側のパブリケーション データベースに対して sp_changearticle を実行します。 @property に identity_range または pub_identity_range を指定し、新しい値の範囲を @valueに指定します。
新しい範囲の割り当てのしきい値を変更するには、パブリッシャー側のパブリケーション データベースに対して sp_changearticle を実行します。 @property に threshold を指定し、 @valueに新しいしきい値を指定します。
マージ パブリケーションの既存のアーティクルに対する ID 範囲管理設定を自動的に変更するには
パブリッシャー側のパブリケーション データベースに対して sp_helpmergearticle を実行し、結果セットの identity_support の値を確認します。 値が 0の場合、自動 ID 範囲管理は有効ではありません。
結果セットの identity_support の値が 1の場合、次のようにして設定を変更します。
割り当てられている ID 範囲を変更するには、パブリッシャー側のパブリケーション データベースに対して sp_changemergearticle を実行します。 @property に identity_range または pub_identity_range を指定し、新しい値の範囲を @valueに指定します。
新しい範囲の割り当てのしきい値を変更するには、パブリッシャー側のパブリケーション データベースに対して sp_changemergearticle を実行します。 @property に threshold を指定し、 @valueに新しいしきい値を指定します。 いつ新しい ID 範囲が割り当てられるのかについては、「ID 列のレプリケート」の「ID 範囲の割り当て」を参照してください。
自動 ID 範囲管理を無効にするには、パブリッシャー側のパブリケーション データベースに対して sp_changemergearticle を実行します。 @property に identityrangemanagementoption を指定し、 @value に manual または noneを指定します。