テーブルのLOCK_ESCALATIONの設定でマージレプリケーションが失敗するのはなぜですか?
-
03-07-2019 - |
質問
マージレプリケーションに問題があります。パブリッシャーは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) ')' に伝播できませんでした サブスクライバ。
これが役立つことを願っています。