Sql Server 2008 でレプリケーションをセットアップすると、サブスクライブしているデータベースへのデータの転送を容易にするために、システムはレプリケートされたテーブルごとにトリガーを作成します。
システムによって生成されたトリガーがSET NOCOUNT ON
、そのアクションが関数の値に影響を与えるのを防ぐために使用することは、予期される動作でしょう@@ROWCOUNT
か?
バックグラウンド
Sql Server 2008 バックエンド データベースで NHibernate を使用しています。データベースでは、サブスクライバーへのデータ転送を容易にするために、パブリッシュされたテーブルにシステム生成トリガーを作成するレプリケーションが有効になっています。
レプリケーションがなければすべて正常に動作しますが、レプリケーションを使用すると、影響を受ける NHibernate の行の検証チェックが失敗します。ADO.Net が影響を与えたと言う行数には、コマンド自体の影響を受ける行に加えて、関連するトリガーの影響を受ける行が含まれているようです。
元の質問で Sql Server 関数について言及しましたが、本当の意味は、ADO.Netメソッド@@ROWCOUNT
によって返される「影響を受ける行」の値です。ExecuteNonQuery
私は、後者が前者によって供給されたという仮定に (おそらく間違って) 取り組んでいたと思います。
一時的な解決策として、レプリケーション トリガーを変更して、SET NOCOUNT ON
更新前に を追加し、更新が完了した後にこれを元に戻すようにしました。これで当面の問題は解決しますが、実行可能な恒久的な解決策ではありません。私たちが受け取ったアドバイスと常識によれば、システムトリガーを編集することはお勧めできません。
ただし、これは、正確な問題を特定したことを示唆しています。トリガーの影響を受ける行は、現在のコマンドの影響を受ける最終的な行数に含まれています。NHibernate は既知の数の行のみが影響を受けることを想定しており、(NHibernate に関する限り) 不明なトリガーがこの数に追加されることを想定していません。
現在、NHibernate を拡張してこれに対処する機能を追加するか、少なくともこれを抑制するオプションを調査中です。私たちのリソースには、この SO の質問が含まれています。
また、システムによって生成されたトリガーがデフォルトで NOCOUNT オプションをすでに ON に設定しているため、それらを変更する必要がないことを示唆しているように見えるこの投稿も見つけました。これは私たちには絶対に当てはまらないので、なぜそうなのかと思っていました。
- システム生成トリガーに関するデフォルトの状況は何ですか?
- 動作は構成可能ですか?
- レプリケーションのタイプ (マージ、トランザクション) に依存しますか?