web-dev-qa-db-ja.com

SqlTableDependencyonchangeイベントが発生しません

sqlTableDependencyに問題があります。目的のテーブルに挿入/更新/削除を行うと、Changedメソッドが呼び出されません。 OnStatusChangedイベントは正常に機能します。

 string conn = @"data source=secret server; integrated security=True; initial catalog=secret db;User id=secret user";

    var mapper = new ModelToTableMapper<SqlDataModel>();

    mapper.AddMapping(c => c.datavalue, "datavalue");       

    using (var dep = new SqlTableDependency<SqlDataModel>(conn, "data", mapper))
    {
        dep.OnChanged +=  Changed;
        dep.OnStatusChanged += OnStatusChanged;
        dep.OnError += OnError;
        dep.TraceLevel = TraceLevel.Verbose;
        dep.TraceListener = new TextWriterTraceListener(Console.Out);            
        dep.Start();          

        Console.WriteLine("Press a key to exit");           
        Console.ReadKey();            
        dep.Stop();
    }
}
static void OnStatusChanged(object sender, StatusChangedEventArgs e)
{
    Console.WriteLine(e.ToString());
}
static void OnError(object sender, ErrorEventArgs e)
{
    Console.WriteLine(e.ToString());
}
static void Changed(object sender, RecordChangedEventArgs<SqlDataModel> e)
{      
    if (e.ChangeType != ChangeType.None)
    {
        var changedEntity = e.Entity;
        Console.WriteLine("DML operation: " + e.ChangeType);          
        Console.WriteLine("value: " + changedEntity.datavalue);
    }
}

上記のコードに基づいています https://tabledependency.codeplex.com/wikipage?title=SqlTableDependency 私はdb_ownerロールを持っていると確信しています。ブローカーを有効にしました。トリガー、サービスなどがmssqlデータベースに作成されていることがわかります。

enter image description here

9
Kuba Wenta

最終的に、sys.transmission_queueテーブルにエラーが見つかりました。ターゲットキューにメッセージをエンキューしているときに例外が発生しました。エラー:

15517、状態:1。プリンシパル「dbo」が存在しないか、このタイプのプリンシパルを偽装できないか、権限がないため、データベースプリンシパルとして実行できません。

データベースはすでに完全な許可を与えていますが、まだしていませんでした

ALTER AUTHORIZATION ON DATABASE::secret db TO sa
6
Kuba Wenta

また、「レコードの変更を追跡するための互換性レベルとデータベースバージョンに関する注意」セクション https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency も確認してください。

SQLServerインスタンスがSQLServer 2008 R2または最新バージョンである場合でも、データベースが古いSQL Serverバージョン(SQL Server 2005など)を使用して作成されている可能性があります。

1
mmam