FIX] SQL Server 2005 で、マージ レプリケーションのサブスクライバーでデータを挿入するときにエラー メッセージ:"メッセージ 548、レベル 16、状態 2、行 1。 挿入に失敗しました"

文書翻訳 文書翻訳
文書番号: 953481 - 対象製品
# をバグ: 50002854 (SQL 修正プログラム)
マイクロソフトでは Microsoft SQL Server 2005 の修正プログラム、1 つのダウンロード ファイルとして配布します。 修正プログラムは累積的なあるため各新しいリリースすべての修正プログラムおよびが含まれています、以前の SQL Server 2005 に同梱されたすべてのセキュリティ修正プログラム リリースを修正します。
すべて展開する | すべて折りたたむ

目次

現象

以下のシナリオを考えます。 SQL Server 2005 でマージ パブリケーションを構成します。 マージ パブリケーションに ID 列を含むテーブルを追加するとします。 次に、データは、パブリッシャーのテーブルに挿入します。 サブスクライバーと、パブリッシャー間でデータを同期するし、パブリッシャーで追加のデータを挿入しようとしとします。 このシナリオでは、パブリッシャーで次のエラー メッセージが表示されます。
msg 548、レベル 16、状態 2、行 1
挿入できませんでした。 ID と、競合しています範囲 'DatabaseName '、レプリケートされたテーブルのデータベース内の制約の確認 ' SchemaTableName '、列 ' ColumnName'。 ID 列は、レプリケーションによって管理自動的に、する場合、範囲の更新がよう: パブリッシャーは sp_adjustpublisheridentityrange を実行し、サブスクライバーは、ディストリビューション エージェントまたはマージ エージェントを実行します。
に、エラー メッセージで前述したパブリッシャーで sp_adjustpublisheridentityrange ストアド プロシージャを実行しようとする場合も問題の解決できません。

この問題は、複数のマージ エージェントは、同じマージ パブリケーションに対して同時にデータを同期する場合に発生します。 マージ パブリケーションに多数のサブスクライバーがある場合はこの問題を exacerbated ことができます。

原因

この問題は、パブリッシャーのテーブルの現在の ID 値が ID 範囲のチェック制約の ID 範囲内にないために発生します。 この現象は、複数のマージ エージェントを使用してパブリッシャーで、次の ID 範囲を作成して同時に、ID 範囲を増やす場合に発生します。

解決方法

この問題に対する修正は累積的な更新プログラム 8 でまずリリースされました。 この累積的な更新プログラム パッケージを SQL Server 2005 Service Pack 2 の入手方法の詳細についてをクリックして次資料「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
951217SQL Server 2005 Service Pack 2 用の累積的な更新プログラム パッケージ 8
メモ ビルドは累積的なあるため各新しい修正プログラム リリースすべての修正プログラムおよびが含まれています、以前の SQL Server 2005 に同梱されたすべてのセキュリティ修正プログラム リリースを修正します。 この修正プログラムを含む最新の修正プログラム リリースを適用を検討することを推奨します。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください:
937137SQL Server 2005 Service Pack 2 がリリースされた後にリリースされた、SQL Server 2005 のビルドします。
特定の SQL Server サービス パックの Microsoft SQL Server 2005 の修正プログラムが作成されます。 SQL Server 2005 Service Pack 2 のインストール、SQL Server 2005 Service Pack 2 修正プログラム適用する必要があります。 既定では、SQL Server サービス パックで提供されるすべての修正プログラムが、次の SQL Server サービス パックで含まれて。

回避策

この問題を回避するには複数の同時実行マージ同期を防ぐ必要があります。 これを行うには、 max_concurrent_merge プロパティを設定、差し込み印刷文書を次のステートメントを実行:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
メモ この回避策を使用すると、多くのサブスクライバー、パブリケーションの場合パフォーマンスを低下可能性があります。 これは、1 つだけのサブスクライバーずつデータを同期できるためです。

状況

マイクロソフトとして認識していますこの問題を記載されているいるマイクロソフト製品の問題。

詳細

この問題が発生しているかどうかを確認する方法

この問題が発生しているかどうかを確認して、次の手順に従います。
  1. 現在の ID 値が ID 範囲のチェック制約の最初の ID 範囲の下限より小さいか確認します。

    現在の ID 値を取得するには、次のステートメントを実行:
    SELECT IDENT_CURRENT ('<TableName>')
    の ID 範囲のチェック制約、ID 範囲を取得する次のステートメントのいずれかを実行します。
    ステートメント 1
    sp_helpconstraint '<TableName>'
    ステートメント 2
    select * from MSmerge_identity_range
    where is_pub_range <>1
    AND artid IN 
     (select artid from sysmergearticles where name='<TableName>')
    AND subid in 
     (select subid from sysmergesubscriptions  MS
    join sysmergepublications MP 
    on MS.subscriber_server=MP.publisher
    AND MS.db_name = MP.publisher_db
    WHERE name='<PublicationName>'
    )
    
  2. SQL Server プロファイラー トレースを使用して、sp_MSsetup_publisher_idrange ストアド プロシージャの実行をインターリーブされている同じパブリケーションの別のマージ エージェントのセッションによって開始されたかどうかを決定します。

    ただし、sp_MSsetup_publisher_idrange ストアド プロシージャの実行をインターリーブされている常に指定しないこの問題が発生しています。 これは、元の occurance のマージ同期の最初のエラー メッセージを生成する SQL Server プロファイラーが実行されていないためです。 ただし、sp_MSsetup_publisher_idrange ストアド プロシージャの実行をインターリーブされているこの問題が発生している可能性がありますを増加する操作を行います。
  3. 「548」のエラー メッセージを受信したときに発生するマージ同期の重複が発生したを検索できます。 これを行うには、差し込み印刷のヒストリをディストリビューション データベースで確認できます。 これを行うには、以下のステートメントを実行: #sessiontimes dbo.MSmerge_history A.agent_id に、結合 dbo.msmerge_agents B からに EndTime として
    Use distribution
    GO
    select session_id, agent_id, B.publication, min(time) as StartTime, max(time) as EndTime
    into #sessiontimes
    from dbo.MSmerge_history A
    join dbo.msmerge_agents B
    on A.agent_id = B.id
    group by session_id, agent_id, publication
    order by 3 desc
    GO
    -- The left side result is the original session. The right side result is the overlapping session.
    select A.*, B.* 
    from #sessiontimes A
    Join #sessiontimes B
    On B.StartTime >= A.StartTime
    AND B.StartTime <= A.EndTime
    AND A.session_id <> B.session_id
    And A.publication=B.publication
    Order By A.StartTime asc
    GO
    drop table #sessiontimes
    

既存の修正方法破損の問題のあるテーブルの ID 範囲

累積的な更新をインストールした後、または、回避策」の記載されているメソッドを使用した後には、テーブル内の既存の破損の ID 範囲は修正されません。 まだ受け取ります「548」、エラー メッセージ テーブルにデータを挿入し、サブスクライバーでデータを同期しようとした場合。 したがって、テーブルの破損の ID 範囲を手動で修正する必要があります。 これを行うには、次の手順に従います。

メモ これらする手順には方法は手動で正しくパブリッシャーの ID 値を reseed するテーブルの現在の ID シード値をオーバーライドが含まれています。 破損した状態で現在の ID 値はマージ レプリケーションの ID 範囲のチェック制約で、最初の ID 範囲より小さい。 手順は、マージ レプリケーション ID 範囲のチェック制約で定義されている ID の範囲内に ID 値を手動で発生します。 ユーザーが、昇順の方法で構成されていると識別する増分値にいる 1 の値を大きく引き継ぐことは手順。
  1. 身元インクリメント値が 1 であるされ ID 進行方法を昇順である確認します。 パブリッシャーで次のステートメントを実行しての ID インクリメント値を取得することができます:
    SELECT IDENT_INCR( '<TableName>')
  2. 現在の ID 値を問題の ID 列に検索するパブリッシャーで次のステートメントを実行:
    DBCC CHECKIDENT ('<TableName>')
    、結果が表示されたら、以降の手順で比較のため 現在の ID 値 値を確認します。 大きいか 、現在の ID 値 より小さいはこと、 現在の列値 valye を確認します。

    現在の列値 値を 現在の ID 値 を超える場合、列の値を他のレプリケーション トポロジ内で発生したあり、パブリッシャーのレプリケーションに正常にマージがあります。 列の現在値 、現在の ID 値 より小さい場合、値が挿入されたパブリッシャーで以前一度に IDENTITY_INSERT の設定にして、マージ レプリケーションの構成前に、のステートメント。
  3. 次のステートメントは、現在の ID 範囲の ID 範囲の問題のあるテーブルの制約をチェック オンを決定するパブリッシャーで実行:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    、結果が表示されたら、 constraint_name 列の値が"repl_identity_range_ GUID、場所、レコードの constraint_keys 列の値を確認します。 GUID 値 sysmergearticles システム テーブル内のアーティクルの artid 列の値に対応します。 GUID を取得する次ステートメントを実行: sysmergearticles から選択の artid を
    select artid from sysmergearticles where name = '<TableName>'
    、ID 範囲のチェック制約が 2 つの独立した範囲にわたります。 2 つの範囲の連続にはありません。 たとえば、 constraint_keys 列の値にとおりなることができます。
    ([ColumnName] > (1001) と [ColumnName]<=(2001)
    または [ColumnName] > (9001) と [ColumnName]<=(10001))
    メモ この資料では次の使用例を使用して、残りの手順のコードを表示するします。

    この例では、各範囲は 1, 000 の値を します。 1, 000 は、既定の範囲サイズです。 ただし、次の方法のいずれかして、ID 範囲のサイズを変更することができます。
    • @ pub_identity_range を指定する ストアド プロシージャのパラメーター、sp_addmergearticle を実行するとします。
    • [ アーティクルのプロパティ ] ダイアログ ボックスで、アーティクルの サブスクライバーの範囲サイズ プロパティ変更します。
  4. 「現象」に記載されている問題が発生した場合を現在のステップ 2 でメモした ID 値が手順 3 でメモした ID の範囲チェック制約最初の ID 範囲の下限より小さい場合はです。

    手順 2 での現在の ID 値が、2 番目の ID 範囲の上限を超える場合の ID 範囲の制約を確認、エラー メッセージで推奨されているメソッドを使用して問題を解決します。 そのため、パブリッシャーで sp_adjustpublisheridentityrange ストアド プロシージャを実行する必要があります。

    sp_adjustpublisheridentityrange ストアド プロシージャの詳細については、ご覧次マイクロソフト開発者向けネットワーク (MSDN) 下さい。
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. すべての行は、ID 範囲のチェック制約の現在の ID 範囲内かどうかを調べるために次のステートメントの実行:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    メモ
    • ステートメントが 0 を返した場合に、現在の ID 範囲の行がありません。 ここでは、手順 6 に進みます。
    • ステートメントが 0 より大きい値を返した場合は、現在の ID 範囲の最大の ID 値を取得する次ステートメントを実行:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      、返される値を確認し、[手順 7 に進みます。
  6. 手動で有効な範囲内に該当する問題のあるテーブルの現在の ID を reseed します。

    1 を加えた、現在の ID 範囲の最小値に現在の ID を reseed します。 たとえば、1001年を現在の ID 範囲の最小値には、最初可能な範囲でので値は 1002 ID 範囲のチェック制約の範囲の下限を使用して、大きい不等号 (>)。 この場合は、パブリッシャーで次のステートメントを実行して手順 8 に進みます。
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. 手動で有効な範囲内に該当する問題のあるテーブルの現在の ID を reseed します。

    したアイデンティティ増分値を 1 と仮定します。 手順 5 でメモした値に現在の ID を reseed して 1 を追加します。、 たとえば、手順 5 でメモした値が 1507年に場合、reseed 1508 を現在の ID。 これを行うには、パブリッシャーで次のステートメントを実行:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. 新しい行をエラー 548 発生なしのパブリッシャー データベースのテーブルに挿入できるかどうかを確認するテストを実行します。
どのようなファイルが変更されたの詳細についてはおこの「サポート技術情報」(Microsoft Knowledge Base) 資料に記載されている修正プログラムが含まれている累積的な更新プログラム パッケージを適用するすべての前提条件についてはクリックしてください資料の「サポート技術情報」(Microsoft Knowledge Base) を表示する次の資料番号。
951217SQL Server 2005 Service Pack 2 用の累積的な更新プログラム パッケージ 8

関連情報

SQL Server Service Pack 2 の後に表示されるビルドの一覧の詳細についてをクリックして次「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
937137SQL Server 2005 Service Pack 2 がリリースされた後にリリースされた、SQL Server 2005 のビルドします。
SQL Server の増分サービス モデルに関するについては、「サポート技術情報」(Microsoft Knowledge Base) を表示する次の資料番号をクリック。
935897増分サービス モデルは、SQL Server チーム報告された問題に対する修正プログラムを提供するには
SQL Server 2005 Service Pack 2 を取得する方法の詳細についてはをクリックして以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
913089SQL Server 2005 の最新の Service Pack の入手方法
新機能および、強化された SQL Server 2005 Service Pack 2 の詳細については、次のマイクロソフト Web サイトを参照してください。
http://go.microsoft.com/fwlink/?LinkId=71711
SQL Server の名前付けスキーマの詳細については、更新をクリックして次資料「サポート技術情報」(Microsoft Knowledge Base) 資料を参照します。
822499Microsoft SQL Server ソフトウェア更新プログラム パッケージの新しい名前付けスキーマ
ソフトウェア更新の用語についてについては、資料の「サポート技術情報」(Microsoft Knowledge Base) を表示する次の資料番号をクリック。
824684マイクロソフトのソフトウェアの更新で使用される一般的な用語の説明

プロパティ

文書番号: 953481 - 最終更新日: 2008年7月11日 - リビジョン: 1.0
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Workgroup Edition
キーワード:?
kbfix kbqfe kbpubtypekc kbhotfixrollup kbexpertiseadvanced kbhotfixserver kbsql2005repl kbautohotfix kbmt KB953481 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:953481
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com