テーブルのLOCK_ESCALATIONの設定でマージレプリケーションが失敗するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/813403

質問

マージレプリケーションに問題があります。パブリッシャーはSQL Server 2008を実行し、2つのサブスクライバーは2005を実行しています。パブリッシャーは、サブスクライバーに ALTER TABLE Foo SET(LOCK_ESCALATION)コマンドを送信しようとしています。このコマンドはSQL Server 2008の新機能であり、その場合は2005サーバーでコマンドが失敗することは理にかなっています。ただし、マージレプリケーションは2005年の互換性のために設定されています。

  

スキーマスクリプト 'if object_id(N' [dbo]。[Users] ')はnullではありませんexec(' ALTER TABLE [dbo]。[Users] SET(LOCK_ESCALATION = TABLE)   ')'をサブスクライバーに伝搬できませんでした。

出版社がこれを試みている理由についてのアイデアはありますか?

編集: 2008サーバーの互換性レベルは" Sql Server 2005(90)"に設定されています

役に立ちましたか?

解決

これは、SQL 2008の新機能であり、2005年にはサポートされていません。セットアップの複雑さによっては、データベースを互換性90(SQL 2005)で実行して、SQL 2008機能を追加しないでください。データベース。スキーマデータのレプリケーションは、常に少し控えめになって以来、大きな問題を抱えてきました。私はいつもそれを愚かにしてデータを管理しようとしています-マージレプリケーションを使用して32人のサブスクライバーを持つマージシステムをサポートする必要があり、スキーマの変更をプッシュしたときに絶えず大きなスキーマの問題がありました。

それは、文書化されているように機能する場合、ロック変更をプッシュしようとしてはならないということです。サブスクリプションがSQL 2005互換としてマークされていることを確認します。データ型(たとえば)のように2008年から2005年までの設定の自動マップを作成していない可能性があります

SQL開発者の1人しばらく前に新しいロックタイプについてブログに投稿

他のヒント

これは、この命令とSQL Server 2005との非互換性、および複製中のテーブルでスキーマを変更すると、この命令がスキーマの変更に反映されるためです。

2つの方法があります:サブスクリプションを削除して再度作成します。運用サーバーにある場合は適用できません。 2番目の方法は、データベースの sysmergeschemachange テーブルに移動し、次のような行を削除します。

  

スキーマスクリプト 'if   object_id(N '[dbo]。[Users]')は   null exec( 'ALTER TABLE [dbo]。[ユーザー]   SET(LOCK_ESCALATION = TABLE) ')'   に伝播できませんでした   サブスクライバ。

これが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top