このデータベースのスキーマを変更できません。それは独自のトリガーを備えたERPデータベースであり、そのバージョンの更新は私のものを押しつぶします. Notification Services がなくなるかなくなったので、これを行う他の方法はありますか? おそらく、低レベルの COM API か、.NET SQL Server Management APi の何かでしょうか?
2 に答える
トリガーを追加することはできないので、唯一の選択肢は時限ポーリングだと思います。ポーリングを使用する場合、実際には更新を受信していませんが、基本的に通知のように機能するデータへの変更について、半頻度のサイクルでクエリを実行しています。
これを実装するのは簡単ではありませんが、それほど難しくもありません。複雑さは、ポーリングする必要があるテーブルの数と構造に起因します。これが機能する最善の方法は、各テーブルの DateTime 列に対してクエリを実行し (利用可能な場合)、最新の最大時間を現在のクエリの最大時間と比較することです。2 つが異なる場合は、変更が発生し、必要なビジネス ロジックを開始します。
使用可能な DateTime 列がない場合は、主キーの変更をテストすることもできます (自動インクリメント フィールドの最大値を比較します)。挿入の場合、DateTime と int PKey の比較は両方とも機能します。更新の場合は DateTime の比較のみが機能します (更新時に pkey の増分はありません) が、削除を検出する場合は、実際に db から行を削除すると、DateTime の変更がなく、キーをオンにしたデータ以降の pkey の増分がないため、はるかに興味深いものになります。去った。(テーブルの行をカウントすると、ポーリング クエリ間で同じ数の項目が挿入および削除される場合、ロジックが壊れます。)
System.Data.SqlClient 名前空間には、 SqlDependencyなどの役立つクラスがいくつかあります。ただし注意してください:
SqlDependency は、データベースに対してアクティブな依存関係を持つ比較的少数のサーバーが存在する ASP.NET または中間層サービスで使用するように設計されています。これは、数百または数千のクライアント コンピューターが単一のデータベース サーバーに対して SqlDependency オブジェクトをセットアップするようなクライアント アプリケーションで使用するようには設計されていません。
これは、SqlDependency を使用する場合は、何らかのメカニズムを使用してクライアントに変更を通知する (プッシュ)、またはクライアントが "プル" するための簡単にクエリ可能なデータを公開するサーバー コンポーネントであることを確認する必要があることを意味します。
これは、サブスクライバー データベースで独自のトリガーを使用してレプリケーションを介して行います。