Domanda

Problema:

Ci sono un sacco di diversi database, che è popolata da molte applicazioni differenti direttamente (senza alcun livello di applicazione comune). I dati si può accedere solo attraverso la SP (dalla politica)

Obiettivo:

esigenze di applicazione per tenere traccia delle variazioni di questi database e reagire in tempo minimo.

Possibili soluzioni:

1) Creazione di trigger per ogni tabella in ogni database, che popolerà una tabella con gli eventi. Applicazione guarderà questa tabella attraverso SqlDependency.

2) Guarda ogni tabella in ogni database attraverso SqlDependency.

3) Creazione di trigger per ogni tabella in ogni database, che ne informa applicazione che utilizza l'estensione gestita.

Qual è il modo migliore?

È stato utile?

Soluzione

Questo può essere un vasto argomento. Prima di tutto:? Qual è la versione di SQL Server utilizzato

Se si sta usando SQL 2008, la Change Data Capture è lo strumento di scelta Questa nuova funzione consente di monitorare ogni modifica apportata al database in SQL 2008. Questo include DDL modifiche e modifiche ai dati . Controllare un'introduzione qui .

Se si utilizza una versione precedente di SQL 2008 e si è permesso di modificare il DDL del database del 3 sarebbe quello della scelta (del una volta che hai descritto). Non lo consiglio, però, dato che ci sono altre cose da considerare, come quello che succede quando un rotoli di transazione indietro o quando trigger sono disattivati ??durante l'inserimento di massa per esempio?

Sarà tranquilla una sfida per rendere il vostro lavoro correttamente soluzione in tutti questi casi.

Un altro modo si potrebbe andare è quello di guardare il log delle transazioni file. In questo modo di gran lunga il migliore, ma anche modo più complesso di farlo, dal momento che non v'è quasi alcuna documentazione sul formato di registro proprietario. Inoltre è destinato a una specifica versione di SQL Server. Questo si tradurrà in un alcun impatto il monitoraggio dei database selezionati.

Un altro approccio è la creazione di una copia dei dati che deve essere monitorato e periodicamente controllare se ci sono differenze. Questo ha il vantaggio che Nessuna modifica per i database di origine devono essere fatte. Così come sbarazzarsi di problemi di transazione o di massa inserimento. Dal momento che più tardi alla successiva esecuzione di monitoraggio si sarà in grado di scoprire i cambiamenti.

L'impatto sulle prestazioni è piuttosto minimale poiché richiederebbe soltanto un indice di lettura consecutivi primaria per le tabelle che devono essere monitorati. E questo è di gran lunga il modo più ottimizzato di interagire con un database. Questo approccio, tuttavia, impone un certo sforzo di sviluppo. Devo sapere, dal momento che questo è il mio primo obiettivo in quanto negli ultimi anni. Controllare qui ;)

(spero che collega è ok, in questo caso, poiché la sua sul tema altrimenti mi toglierlo)

Altri suggerimenti

Do non rivedere possibilità di utilizzare SQL Profiler. Utilizzando il filtro è possibile selezionare solo aggiornare le operazioni, quindi scrivere il login.

È possibile utilizzare una realizzazione open source della classe SqlDependency - SqlDependencyEx . Esso utilizza un trigger del database e la notifica nativo Service Broker per ricevere gli eventi sui cambiamenti della tabella. Questo è un esempio di utilizzo:

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 si è in grado di monitorare solo inserire o eliminare, evitando UPDATE. Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top