1

このデータベースのスキーマを変更できません。それは独自のトリガーを備えたERPデータベースであり、そのバージョンの更新は私のものを押しつぶします. Notification Services がなくなるかなくなったので、これを行う他の方法はありますか? おそらく、低レベルの COM API か、.NET SQL Server Management APi の何かでしょうか?

4

2 に答える 2

3

トリガーを追加することはできないので、唯一の選択肢は時限ポーリングだと思います。ポーリングを使用する場合、実際には更新を受信して​​いませんが、基本的に通知のように機能するデータへの変更について、半頻度のサイクルでクエリを実行しています。

これを実装するのは簡単ではありませんが、それほど難しくもありません。複雑さは、ポーリングする必要があるテーブルの数と構造に起因します。これが機能する最善の方法は、各テーブルの DateTime 列に対してクエリを実行し (利用可能な場合)、最新の最大時間を現在のクエリの最大時間と比較することです。2 つが異なる場合は、変更が発生し、必要なビジネス ロジックを開始します。

使用可能な DateTime 列がない場合は、主キーの変更をテストすることもできます (自動インクリメント フィールドの最大値を比較します)。挿入の場合、DateTime と int PKey の比較は両方とも機能します。更新の場合は DateTime の比較のみが機能します (更新時に pkey の増分はありません) が、削除を検出する場合は、実際に db から行を削除すると、DateTime の変更がなく、キーをオンにしたデータ以降の pkey の増分がないため、はるかに興味深いものになります。去った。(テーブルの行をカウントすると、ポーリング クエリ間で同じ数の項目が挿入および削除される場合、ロジックが壊れます。)

System.Data.SqlClient 名前空間には、 SqlDependencyなどの役立つクラスがいくつかあります。ただし注意してください:

SqlDependency は、データベースに対してアクティブな依存関係を持つ比較的少数のサーバーが存在する ASP.NET または中間層サービスで使用するように設計されています。これは、数百または数千のクライアント コンピューターが単一のデータベース サーバーに対して SqlDependency オブジェクトをセットアップするようなクライアント アプリケーションで使用するようには設計されていません。

これは、SqlDependency を使用する場合は、何らかのメカニズムを使用してクライアントに変更を通知する (プッシュ)、またはクライアントが "プル" するための簡単にクエリ可能なデータを公開するサーバー コンポーネントであることを確認する必要があることを意味します。

于 2010-12-18T16:14:12.257 に答える
1

これは、サブスクライバー データベースで独自のトリガーを使用してレプリケーションを介して行います。

于 2010-12-18T16:35:48.497 に答える