Tabella cronologia database / tabella di monitoraggio

12

Attualmente voglio strutturare una tabella di monitoraggio / cronologia come questa:

  • PrimaryKey - ID
  • OtherTableId - fk
  • fieldName - nome del campo il suo monitoraggio
  • OldValue
  • NewValue
  • UserName
  • CreateDateTime

Quindi in pratica voglio avere una tabella che tracci un'altra cronologia delle tabelle, memorizza il nome della colonna del campo modificato con il nuovo e il vecchio valore. La mia domanda è: qualcuno può fare buchi in questo? Inoltre, qual è il modo più semplice per garantire che solo il nome di una colonna delle tabelle venga inserito nella colonna fieldName? Attualmente le mie opzioni sono di avere un enum nel servizio che sto costruendo, o creare un'altra tabella di stato e rendere fieldName un fk. Qualche idea migliore?

Modifica Obiettivo: attualmente ci sono solo 2 campi che vogliamo monitorare. Un campo verrà mostrato su una pagina Web per visualizzare la cronologia, l'altro campo sarà accessibile solo da un dipartimento e avranno accesso a una vista del database che sarebbero in grado di interrogare. Stanno interrogando solo questo campo per ottenere informazioni su chi ha cambiato il campo e cosa fare. Questo è il motivo per cui abbiamo voluto impostarlo dove un campo del database definisce la colonna della tabella piuttosto che avere una copia esatta della cronologia del record della tabella. Vogliamo solo due campi tracciati con le possibilità di aggiungere o rimuovere campi in futuro.

Grazie!

    
posta user76982 08.01.2013 - 17:02
fonte

4 risposte

8

Poking holes: cosa succede se lo schema del database viene modificato nello stesso punto più avanti nel tempo e il nome di una colonna cambia o la colonna viene cancellata completamente? Un sacco di sistema di database permettono questo. Cosa succederà al tuo "fieldName" allora?

Per l'integrità dei dati: è necessario accertarsi che ogni operazione di aggiornamento o eliminazione possa sicuramente aggiornare la tabella di monitoraggio. Ciò è meglio realizzato dai trigger che chiamano una stored procedure. Devi assicurarti che solo la stored procedure abbia accesso in scrittura alla tabella di tracciamento, così nessun altro può scrivere valori errati.

Se puoi vivere con una soluzione specifica per i db: la maggior parte dei sistemi db hanno tabelle di sistema in cui sono archiviate le informazioni sullo schema (nomi delle tabelle, id delle tabelle, nomi delle colonne, ecc.). È possibile verificare se è possibile impostare un riferimento a chiave esterna a tale tabella di sistema. Ciò consentirebbe di sostituire il nome del campo con un ID campo se il database supporta qualcosa di simile.

In realtà, se devi monitorare intere righe della tabella specifica incluse tutte le colonne (e non solo un piccolo sottoinsieme delle colonne), dovresti prendere in considerazione il suggerimento di @ sarfeast. Leggi questo articolo sugli svantaggi di modelli con valori nominali.

    
risposta data 08.01.2013 - 17:11
fonte
8

L'implementazione di audit dei cambiamenti di maggior successo (tracciamento cronologico) che ho visto è meno generica e molto più semplice. Si tratta di creare una tabella dei log delle modifiche per ogni tabella che si desidera monitorare, mantenendo nomi di colonne e tipi di dati identici (con una colonna aggiuntiva per il timestamp).

L'obiettivo finale, ovvero, quello che vorresti fare con i dati controllati ti aiuterà a valutare l'adeguatezza di ciascun approccio.

    
risposta data 08.01.2013 - 17:16
fonte
7

In breve: devi impostare il meccanismo Audit Trail per le tabelle su cui desideri monitorare la modifica del valore.

Tabella di audit trail singola :

Create a table to log the table name, field name abd old and new versions of the data. For this method it is usual to log both old and new versions of the data and only those fields that have changed. To implement this in triggeres it is a requirement that either there is a primary key on the table or only single rows are updated.

Ecco un buon post con script su come ottenerlo: Creazione di percorsi di controllo

Altri riferimenti utili per cercare:

risposta data 08.01.2013 - 18:16
fonte
3

Potresti controllare la documentazione del progetto di NHibernate per le idee.

Fondamentalmente, hai una tabella di revisione in cui puoi aggiungere dati extra come un timestamp o un utente. Quindi, ogni tabella tracciata riceve una tabella di controllo aggiuntiva con tutte le colonne duplicate, un fk alla tabella di revisione e il tipo di revisione (aggiungi, modifica, elimina). AFAIK, non vorrai che le tue tabelle di controllo abbiano un FK effettivo per la tabella reale perché ciò impedirebbe le eliminazioni.

    
risposta data 08.01.2013 - 18:11
fonte

Leggi altre domande sui tag