パブリッシャーであるデータベースのテーブルを削除しようとしています。問題の表は公開されていません。私が得るエラーは:
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
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では、MicrosoftはSQL Serverレプリケーションの変更を導入しました:DROP TABLEのサポート( https://support.Microsoft.com/en-us/help/317012 ) 。以前は、レプリケーション用にマークされたテーブルを削除できませんでした。この新機能はデフォルトでは有効になっていませんが、DROP TABLEステートメントがエラーをスローしなくなりました。この変更を容易にするために、新しいデータベースレベルのトリガーtr_MStran_droptable
が追加されました。これは、テーブルの削除アクションごとに発生するトリガーであり、イベントデータを使用して、削除されたテーブルを特定し、テーブルがレプリケーション対象としてマークされていてもトランザクションをサポートするオプションが有効になっているかどうかを確認します。
そして、それが問題の出所です。このトリガーは、それをサポートするバージョンのレプリケーションによってのみ作成され、それをサポートするバージョンのレプリケーションによってのみ削除されます。そのため、sp_removedbreplication
のようなものでレプリケーションを核にしても、このトリガーは削除されず、テーブルを削除しようとするたびに引き続き起動します。ドロップしようとしているのは、レプリケーション用にマークされていません。これは次の場合に起こります。
これを自分でテストできます。レプリケーションを無効にしてから再度有効にすると、データベーストリガーの作成時間が発行を再度有効にしたときと一致しますが、tr_MStran_droptable
トリガーは残ります。
この問題を解決するには、次のいずれかを実行できます。