Sql Server 2008でレプリケーションを設定すると、レプリケートされたすべてのテーブルにトリガーが作成され、サブスクライブするデータベースへのデータ転送が容易になります。レプリケーションおよびNOCOUNTオプションのシステムトリガー
システム生成トリガーのSET NOCOUNT ON
を使用して、その動作が@@ROWCOUNT
関数の値に影響しないようにする動作が期待されますか?私は、SQL Server 2008のバックエンドデータベースとNHibernateはを使用しています
背景
。データベースには、発行されたテーブルにシステム生成トリガを作成して、サブスクライバへのデータ転送を容易にするレプリケーションが有効になっています。
レプリケーションがなければ、すべて正常に動作しますが、レプリケーションではNHibernateのローの影響を受けた検証チェックが失敗します。 ADO.Netに影響を与えている行の数には、コマンド自体の影響を受ける行に加えて、関連するトリガーの影響を受ける行が含まれているように見えます。
元の質問では、私は Sql Serverの機能について言及しましたが、私が実際に意味するのは、ADO.Net ExecuteNonQuery
メソッドによって返される "行の影響を受ける"値です。私は、後者が前者によって与えられたと仮定して(おそらく間違って)いると思います。
一時的な解決策として、レプリケーショントリガーを変更して、更新前にSET NOCOUNT ON
を追加し、更新が完了した後にこれを取り消すようにしました。これはしばらく私たちの問題を解決しますが、実行可能な恒久的な解決策ではありません。私たちが受け取ったアドバイスと常識によれば、システムトリガーの編集はお勧めできません。
これは、私たちが正確な問題を特定したことを私に示唆しています。トリガーの影響を受けた行は、現在のコマンドの影響を受ける最後の行に含まれています。 NHibernateは、既知の数の行のみが影響を受けると予想しています。このカウントに追加するトリガは、未知の(NHibernateに関する限り)プロビジョニングしません。
私たちは現在、NHibernateに対処する機能を追加するか、少なくともこれを抑制するオプションの調査を進めています。私たちのリソースにはthis SO questionが含まれています。
また、システム生成トリガーがデフォルトでNOCOUNTオプションをONに設定していることを示唆していると思われるthis postが見つかりました。これは間違いなく私たちには当てはまりません。だから私はなぜこれが起こっているのだろうと思っていました。
- システム生成トリガに関するデフォルトの状況は何ですか?
- 動作は設定可能ですか?
- レプリケーションのタイプ(マージ、トランザクション)に依存しますか?
Books Onlineによると、「SET NOCOUNTがONの場合でも@@ ROWCOUNT関数が更新されます。だからあなたの質問は不明です。あなたは特定の問題を抱えていますか? – Pondlife
はい私はそれがあまりにも簡単すぎると感じました。私は質問でうぬぼれがちな傾向がありますが、今回はあまりにも遠くに行ったと思います。私は精緻化します... –