SqlTableDependency onchange 事件未触发

SqlTableDependency onchange event not fired

我对 SqlTableDependency 有疑问。当我将 insert/update/delete 设置为期望 table 时,不会调用我的 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 数据库中创建的。

我终于在 sys.transmission_queue table 中发现错误: 在目标队列中排队消息时发生异常。错误:

15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

即使数据库已经给了我自己完全权限,我还没有做

ALTER AUTHORIZATION ON DATABASE::secret db TO sa

同时检查 "Note about Compatibility Level and Database Version for tracking record changes" 部分,https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency

Even if your SQL Server instance is SQL Server 2008 R2 or latest versions, can be that your Database has been created using an old SQL Server version, for example SQL Server 2005.