2010-12-06 5 views
1

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が見つかりました。これは間違いなく私たちには当てはまりません。だから私はなぜこれが起こっているのだろうと思っていました。

  1. システム生成トリガに関するデフォルトの状況は何ですか?
  2. 動作は設定可能ですか?
  3. レプリケーションのタイプ(マージ、トランザクション)に依存しますか?
+0

Books Onlineによると、「SET NOCOUNTがONの場合でも@@ ROWCOUNT関数が更新されます。だからあなたの質問は不明です。あなたは特定の問題を抱えていますか? – Pondlife

+0

はい私はそれがあまりにも簡単すぎると感じました。私は質問でうぬぼれがちな傾向がありますが、今回はあまりにも遠くに行ったと思います。私は精緻化します... –

答えて

1

元の質問に対する答えを判断できませんでした - (should/can/how)Sql Serverシステムで生成されたレプリケーショントリガーにSET NOCOUNT ONオプションが自動的に含まれています。

私たちのDBAチームは答えがいいえであることを示唆しています。彼らはまた、生産上のシステム・トリガーをカスタマイズしないと(まったく正しい)と言います。

オプションは私に残っています...

  1. 行数の不一致が検出されたときにTooManyRowsAffectedExceptionを投げないようにNHibernateを変更/拡張します。
  2. NHibernateをリッピングし、ストアドプロシージャとビジネスオブジェクトへの手動マッピングで置き換えます。

私たちは、私が私をコントロールする新しい設定オプションを追加しました...私のソリューションは、次のようにNHibernateの(2.1)コアを変更することでした。1.

  1. 初のオプションを選択しました新しい行動。
  2. 次に、NHibernate.AdoNet.ExpectationsクラスのVerifyOutcomeNonBatchedVerifyOutcomeBatchedメソッドのシグネチャを新しい設定値をパラメータとして受け入れるように変更しました。これには、これらのメソッドが呼び出される場所をいくつか変更する必要がありました。
  3. 最後に、これらの2つの方法を変更して、それぞれがconfigオプションに従ってTooManyRowsAffectedExceptionをスロー/抑制するようにしました。

私は提案されている代替実装に興味があります。

+0

私は同じ問題に直面している!他のソリューションの侵襲性が低いことを発見しましたか? NHibernateのバージョンを更新し、以前のバージョンのコアで行われた変更を複製することを忘れた場合、想像してみてください。 –

関連する問題