tavoli Storia pro, contro e trucchi - utilizzando i trigger, sproc oa livello di applicazione [chiuse]

StackOverflow https://stackoverflow.com/questions/1250507

Domanda

Al momento sto giocando intorno con l'idea di avere tabelle di cronologia per alcuni dei miei tabelle nel mio database. Fondamentalmente ho la tabella principale e una copia di tale tabella con una data di modifica e una colonna azione per memorizzare quale azione è stata preformata ad esempio aggiornare, cancellare e inserire.

Finora mi viene in mente tre luoghi diversi che si possono fare il lavoro tabella di storia.

  • Trigger sul tavolo principale per l'aggiornamento, inserire ed eliminare. (Database)
  • Le stored procedure. (Database)
  • livello di applicazione. (Application)

La mia domanda principale è, quali sono i pro, contro e trucchi di fare il lavoro in ognuno di questi strati.

Un vantaggio mi viene in mente utilizzando il modo trigger è che l'integrità è sempre mantenuto non importa quale programma si implmentated sulla parte superiore del database.

È stato utile?

Soluzione

mi piacerebbe mettere in questo modo:

  • stored procedure: che stanno bypassati se si modifica direttamente al tavolo. Sicurezza sul database in grado di controllare questo
  • applicazione: stesso affare. Anche se si dispone di più applicazioni, possibilmente in diverse lingue, ha bisogno di essere implementato in ogni pila, che è un po 'ridondante; e
  • Trigger: trasparente per l'applicazione e catturerà tutte le modifiche. Questo è il mio metodo preferito.

Altri suggerimenti

I trigger sono il modo più semplice e veloce per raggiungere la storia semplice. Le seguenti informazioni presuppongono un esempio più complesso in cui l'elaborazione storia può includere alcune regole di business e può richiedere informazioni di registrazione non trovato nella tabella monitorato.

Per quelli che pensano che i trigger sono più sicuri di sprocs perché non possono essere aggirati Ricordo loro che stanno facendo le seguenti ipotesi:

!

) Permessi esistano utenti di arresto di eseguire DISABLE TRIGGER [ma poi i permessi potrebbero anche esistere per limitare tutti gli accessi alla base di dati ad eccezione di eseguire su sprocs che è un modello comune per le applicazioni aziendali] - quindi si deve assumere autorizzazioni corrette e sprocs quindi pari trigger in termini di sicurezza e la capacità di essere bypassato

!) A seconda della base di dati può essere possibile per eseguire istruzioni di aggiornamento che non sparano trigger. Potrei approfittare della conoscenza delle nidificato profondità esecuzione del trigger per bypassare un trigger. L'unica soluzione sicura comprende la sicurezza nella base di dati e l'accesso ai dati limitando utilizzando meccanismi approvati -. Se questi siano i trigger, sprocs o livelli di accesso ai dati

Credo che le scelte sono chiare qui. Se i dati si accede da più applicazioni, allora si desidera controllare la storia del più basso livello di comune e questo significherà il database.

Seguendo la logica di cui sopra, la scelta di trigger o stored procedure dipende ancora se la stored procedure è lo strato minimo comune. Si dovrebbe preferire lo sproc sopra il grilletto, come è possibile controllare le prestazioni, e gli effetti collaterali meglio e il codice è più facile da mantenere.

I trigger sono accettabili, ma cercare di fare in modo che non aumentare le serrature con la lettura dei dati al di fuori dei tavoli in fase di aggiornamento. Limite di trigger per inserisce nelle tabelle Ceppo, solo ciò che è necessario.

Se l'applicazione utilizza un livello di accesso logico comune ed è improbabile che questo sarebbe cambiato nel corso del tempo preferirei implementare la logica qui. Utilizzare una catena di modello Responsabilità e un'architettura plug-in, guidare questo da Dependency Injection per consentire tutti i tipi di lavorazione in te modulo di storia, compresa la registrazione completamente diversi tipi di tecnologia, diversi database, un servizio di storia o di qualsiasi altra cosa che si poteva immaginare.

Sono stato con il grilletto approccio basato per anni e ha sicuramente funzionato bene per noi, ma poi non avere i seguenti punti per riflettere su:

  1. Trigger su un molto utilizzato (ad esempio, un'applicazione basata su SaaS multi-tenant) potrebbe essere estremamente costoso

  2. In alcuni scenari, alcuni campi possono ottenere ridondante. I trigger sono buone solo quando si è cristallina sui campi da registrare; pur usando un'applicazione si potrebbe avere uno strato intercettore che potrebbe aiutare si accede alcuni campi in base alla "configurazione"; anche se con la sua quota di spese generali

  3. Senza controllo del database adeguato, una persona potrebbe facilmente disabilitare i trigger, modificare i dati e attivare i trigger; il tutto senza sollevare alcun allarme

  4. In caso di applicazioni web, in cui le connessioni sono stabilite da un pool, monitoraggio gli utenti reali che hanno fatto le modifiche possono essere noioso. Una possibile soluzione potrebbe essere quella di avere il campo "EditedBy" in ogni tabella delle transazioni.

Un tardo ma aggiunge altro paio di opzioni che possono essere considerati.

Change Data Capture: Questa funzione è disponibile in SQL Server 2008 R2 + ma solo in enterprise edition. Esso consente di selezionare le tabelle che si desidera monitorare e SQL Server farà il lavoro per voi. Funziona con la lettura log delle transazioni e il popolamento tabelle di cronologia con i dati.

Lettura log delle transazioni: Se database è in modalità di recupero completo quindi log delle transazioni possono essere letti e dettagli su quasi transazioni può essere trovato.

L'unico lato negativo è che questo non è supportato per impostazione predefinita. Le opzioni sono da leggere log delle transazioni utilizzando funzioni non documentate come strumenti di terze parti fn_dblog o terzi, come ApexSQL Log .

Trigger: funziona bene per le piccole numero di tavoli dove non ci sono troppi trigger da gestire. Se si dispone di un sacco di tavoli che si desidera controllare allora si dovrebbe prendere in considerazione un certo strumento di terze parti per questo.

Tutti questi lavori a livello di database e sono completamente trasparenti per applicazione.

I trigger sono l'unico modo affidabile per acquisire le modifiche. Se lo si fa in stored procedure o l'App, si può sempre andare in e SQL via un cambiamento che non si dispone di un registro per la (inavvertitamente). Naturalmente, qualcuno che non vuole lasciare un log può disabilitare trigger. Ma si preferisce forzare qualcuno a disabilitare la registrazione di quanto sperano che ricordano ad inserirlo.

Di solito, se si sceglie il livello di applicazione, è possibile progettare il codice di app per fare la registrazione in un unico punto, che gestirà consistenly tutto il vostro tavolo storica. diversamente trigger sono un approccio più complicato da mantenere perché sono (a seconda della tecnologia db) replicati per ogni tabella: in caso di centinaia di tavoli la quantità di codice per il trigger coud essere un problema.

se si dispone di un'organizzazione di supporto che manterrà il codice che si sta scrivendo ora, e non si sa chi manterrà il codice (tipico per le grandi industrie) non si può assumere che è il livello di abilità della persona che farà fissare sulla vostra applicazione, in questo caso è meglio a mio parere per rendere la tabella storica principio di funzionamento il più semplice possibile, e il livello di applicazione è probabilmente il posto migliore per questo scopo.

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