私のウェブサイト(asp.net C#)に管理セクションがあり、Dbで行われている挿入更新などのさまざまな操作に関する通知を受け取る必要があります。
特定のユーザーが新しいデータを追加するようなことをしたときに通知を受け取りたいです。
これを SQL Server 2008 に実装するにはどうすればよいですか。
私のウェブサイト(asp.net C#)に管理セクションがあり、Dbで行われている挿入更新などのさまざまな操作に関する通知を受け取る必要があります。
特定のユーザーが新しいデータを追加するようなことをしたときに通知を受け取りたいです。
これを SQL Server 2008 に実装するにはどうすればよいですか。
SQL 内では、変更時に実行されるトリガーを使用できますが、それ以外ではポーリングを検討しています (サービスまたは Web サイト自体を使用して、最後のレコードのインデックスをキャッシュし、別の ID が挿入されているかどうかを確認します)。
テーブルの「最後に挿入されたID」を保存してからチェックする方法(INTキーを想定):
SELECT *
FROM table
WHERE id > @LastObservedIndex;
これにより、最後にチェックしたときからの新しいエントリが返されます。もちろん、新しいエントリが見つかった場合は、キャッシュされた ID を更新して、次の呼び出しでさらに新しいエントリがチェックされるようにする必要があります。
ただし、これをサービスまたはスケジュールされたタスクにすることをお勧めします。つまり、クエリを作成するすべての管理者が、ページにアクセスするたびに新しいエントリをチェックする必要はありません。次に、イベントをメッセージ キューに格納し、ユーザーがページにアクセスした (または AJAX を使用してポーリングした) ときに、新しい通知をユーザーにダンプできます。
または、すべての CRUD 操作を処理している場合 (サイトがすべての更新を行っており、他の外部プロセスとは連携していない場合) は、ログ記録/追跡コードをリポジトリに配置できます。例えば:
public class MessageRepository : IMessageRepository<Message>
{
//
// ...
//
void Add(Message message)
{
//
// add to database code
//
// some logging utility that's tracking transactions against specific
// database elements and reporting them back to some notification log
// that can then be output to the admin
this.LogTransaction<Message>(message, TransactionType.Create);
}
}
ただし、もちろん、これには独自のオーバーヘッドが伴います。