Pregunta

Problema:

Hay una gran cantidad de diferentes bases de datos, que está poblada por muchas aplicaciones diferentes directamente (sin ningún tipo de capa de aplicación común). Los datos sólo se puede acceder a través de SP (por la política)

Tarea:

necesidades de aplicación para rastrear cambios en estas bases de datos y reaccionar en un tiempo mínimo.

Posibles soluciones:

1) Crear disparador para cada tabla en cada base de datos, que se rellenará una tabla con los eventos. Aplicación velará esta tabla a través SqlDependency.

2) Reloj de cada tabla en cada base de datos a través de SqlDependency.

3) Crear disparador para cada tabla en cada base de datos, la cual notificará a la aplicación utilizando la extensión administrado.

¿Cuál es la mejor manera?

¿Fue útil?

Solución

Esto puede ser una extensa tema. En primer lugar: ¿qué se utiliza la versión de SQL Server

Si su están utilizando SQL 2008 en el captura de datos modificados es la herramienta de elección Esta nueva característica le permite monitorizar cada los cambios realizados en las bases de datos en SQL 2008. Esto incluye cambia DDL , así como cambios en los datos . Compruebe una introducción aquí .

Si está utilizando una versión anterior de SQL 2008 y se le permite a modificar el DDL de la base de datos de la 3 sería el de elección (de la una vez que usted ha descrito). Yo no lo recomendaría sin embargo, ya que hay otras cosas a considerar, al igual que lo que sucede cuando vuelve o cuando disparadores se desactivan cuando se inserta mayor por ejemplo? rollos de transacción p>

Será calmar un reto para hacer su trabajo adecuadamente solución en todos estos casos.

Otra forma es que podría ir a ver el archivo de registro de transacciones. De esta manera, con mucho, el mejor, sino también en forma más compleja de hacerlo, ya que no hay casi ninguna documentación sobre el formato de registro de propiedad. También está destinado a una versión específica de SQL Server. Esto dará lugar a una ningún impacto el seguimiento de las bases de datos seleccionados.

Sin embargo, otro enfoque es la creación de un copia de los datos que se va a supervisar y periódicamente comprobar si hay diferencias. Esto tiene la ventaja de que Sin cambios en las bases de datos fuente tiene que ser hecho. Así como deshacerse de los problemas de transacción o la inserción a granel. Desde tardar en el siguiente proceso de monitoreo que será capaz de descubrir los cambios.

El impacto en el rendimiento es bastante escaso, ya que sólo requeriría un índice de lectura consecutiva primaria para las tablas que se van a vigilar. Y esto es, con mucho, la forma más optimizada de interactuar con una base de datos. sin embargo, este enfoque requerirá un gran esfuerzo de desarrollo. Tengo que saber, ya que este es mi primer enfoque desde los últimos años. Compruebe aquí ;)

(espero que une está bien, en este caso, ya que su tema de otra manera lo quito)

Otros consejos

No se revise posibilidad de utilización de perfiles de SQL. El uso del filtro se puede seleccionar sólo actualizar las operaciones, a continuación, escriba en el registro.

Se puede usar una realización de código abierto de la clase SqlDependency - SqlDependencyEx . Se utiliza un trigger y nativa de notificación de Service Broker para recibir eventos sobre los cambios de la tabla. Este es un ejemplo de uso:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

Con SqlDependecyEx que son capaces de controlar simplemente insertar o eliminar, evitando UPDATE. Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top