web-dev-qa-db-ja.com

テーブルはパブリッシュされていませんが、レプリケーションエラーのためテーブルをドロップできません

パブリッシャーであるデータベースのテーブルを削除しようとしています。問題の表は公開されていません。私が得るエラーは:

Msg 15021, Level 16, State 1, Procedure sp_MStran_ddlrepl, Line 14 [Batch Start Line 1]
Invalid value given for parameter @procmapid. Specify a valid parameter value.
Msg 3609, Level 16, State 2, Line 2
The transaction ended in the trigger. The batch has been aborted.

sysarticlesをチェックして、古いレコードまたは孤立したレコードがないか確認しましたが、テーブルが表示されません。問題がここにあるかについてのアイデアはありますか?

編集:SQL Server 2016 RTM

4
Mike Fal

TL; DR:このエラーは、以前に低いバージョンのサーバーまたはパッチ、あるいはその両方に複製されたデータベースを復元(または移動)した場合に発生する可能性がありますレベルを設定してから、レプリケーションを再度有効にします。解決策と詳細な説明については、以下を参照してください。

レプリケーションは、特定のものにデータベーストリガーを使用します

SQL Serverでトランザクションレプリケーション用にデータベースがパブリッシュされると、セットアッププロセスの一部として、いくつかのデータベースレベルのトリガーが作成されます。通常は次のとおりです。

tr_MStran_alterschemaonly
tr_MStran_altertable
tr_MStran_altertrigger
tr_MStran_alterview

それらを見つけるには、オブジェクトエクスプローラーでデータベースを展開し、[プログラマビリティ]、[データベーストリガー]の順に選択します。彼らは彼らが言うことをほとんどします。 tr_MStran_altertableのコードを見ると、このトリガーがALTER TABLEステートメントに対して起動するたびに、SQL ServerはEventData()関数を使用して変更内容をキャプチャし、別のレプリケーションストアドプロシージャを呼び出します。実際にアクティビティをキャプチャし、関連するDDLトランザクションをディストリビューションデータベースに送信します。これは、データ変更を探してキャプチャするログリーダーエージェントとは異なります。

これらのトリガーは、データベースをレプリケーション用に公開するたびに作成され、レプリケーションの削除の一環としても削除されます。

SQL Server 2014 SP2およびSQL Server 2016 SP1での新しいDROP TABLEサポート

SQL Server 2014 SP2およびSQL Server 2016 SP1では、MicrosoftはSQL Serverレプリケーションの変更を導入しました:DROP TABLEのサポート( https://support.Microsoft.com/en-us/help/317012 ) 。以前は、レプリケーション用にマークされたテーブルを削除できませんでした。この新機能はデフォルトでは有効になっていませんが、DROP TABLEステートメントがエラーをスローしなくなりました。この変更を容易にするために、新しいデータベースレベルのトリガーtr_MStran_droptableが追加されました。これは、テーブルの削除アクションごとに発生するトリガーであり、イベントデータを使用して、削除されたテーブルを特定し、テーブルがレプリケーション対象としてマークされていてもトランザクションをサポートするオプションが有効になっているかどうかを確認します。

しかし、SQL Serverの「古い」バージョンはどうでしょうか。

そして、それが問題の出所です。このトリガーは、それをサポートするバージョンのレプリケーションによってのみ作成され、それをサポートするバージョンのレプリケーションによってのみ削除されます。そのため、sp_removedbreplicationのようなものでレプリケーションを核にしても、このトリガーは削除されず、テーブルを削除しようとするたびに引き続き起動します。ドロップしようとしているのは、レプリケーション用にマークされていません。これは次の場合に起こります。

  1. この機能をサポートするバージョン(2016 SP1または2014 SP2)でレプリケーション用にデータベースを公開している
  2. このデータベースを、この機能をサポートしていないバージョンのSQL Server(2016 RTMまたは2014 SP1)にバックアップおよび復元します)
  3. レプリケーション用に復元されたデータベースを公開します。

これを自分でテストできます。レプリケーションを無効にしてから再度有効にすると、データベーストリガーの作成時間が発行を再度有効にしたときと一致しますが、tr_MStran_droptableトリガーは残ります。

問題を修正する

この問題を解決するには、次のいずれかを実行できます。

  1. 影響を受けるインスタンスを、このトリガーをサポートするパッチレベル(2014 SP2または2016 SP1)にアップグレードします。
  2. トリガーはサポートされていないため、手動で削除してください。
7
Drew Furgiuele