Tengo un problema con SqlTableDependency. Mi método modificado no se invoca cuando hago insertar / actualizar / eliminar en la tabla deseada. El evento OnStatusChanged funciona bien.

 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);
    }
}

El código anterior me basé en https://tabledependency.codeplex.com/wikipage?title=SqlTableDependency Estoy seguro de que tengo y estoy usando el rol db_owner. He habilitado el corredor, veo que se crean trigers, services, etc. en mssql db.

enter image description here

9
Kuba Wenta 15 dic. 2016 a las 19:39

2 respuestas

La mejor respuesta

Finalmente encontré un error en mi tabla sys.transmission_queue: se produjo una excepción al poner en cola un mensaje en la cola de destino. Error:

15517, Estado: 1. No se puede ejecutar como principal de la base de datos porque el principal "dbo" no existe, este tipo de principal no se puede suplantar o usted no tiene permiso.

A pesar de que la base de datos ya me dio permiso completo, todavía tenía que hacer

ALTER AUTHORIZATION ON DATABASE::secret db TO sa
8
Kuba Wenta 27 dic. 2016 a las 15:03

Consulte también la sección "Nota sobre el nivel de compatibilidad y la versión de la base de datos para realizar un seguimiento de los cambios en los registros", https : //github.com/christiandelbianco/monitor-table-change-with-sqltabledependency.

Incluso si su instancia de SQL Server es SQL Server 2008 R2 o las últimas versiones, puede ser que su base de datos se haya creado con una versión anterior de SQL Server, por ejemplo, SQL Server 2005.

1
mmam 11 oct. 2019 a las 06:03