La migliore progettazione per un log delle modifiche / tabella del database di controllo? [chiuso]

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

  •  03-07-2019
  •  | 
  •  

Domanda

Devo creare una tabella di database per memorizzare diversi registri / controlli delle modifiche (quando è stato aggiunto, eliminato, modificato qualcosa, ecc.). Non ho bisogno di memorizzare informazioni particolarmente dettagliate, quindi stavo pensando a qualcosa del genere:

  • id (per evento)
  • utente che lo ha attivato
  • nome evento
  • descrizione dell'evento
  • data / ora dell'evento

Mi sto perdendo qualcosa qui? Ovviamente posso continuare a migliorare il design, anche se non ho intenzione di complicarlo (la creazione di altre tabelle per tipi di eventi o cose del genere è fuori discussione poiché è una complicazione per le mie esigenze).

È stato utile?

Soluzione

Nel progetto a cui sto lavorando, anche il registro di controllo è partito dal design molto minimalista, come quello che hai descritto:

event ID
event date/time
event type
user ID
description

L'idea era la stessa: mantenere le cose semplici.

Tuttavia, divenne presto evidente che questo design minimalista non era sufficiente. L'audit tipico si riduceva a domande come questa:

Who the heck created/updated/deleted a record 
with ID=X in the table Foo and when?

Quindi, per essere in grado di rispondere rapidamente a queste domande (usando SQL), abbiamo finito per avere due colonne aggiuntive nella tabella di controllo

object type (or table name)
object ID

Questo è il momento in cui la progettazione del nostro registro di controllo si è davvero stabilizzata (ormai da qualche anno).

Naturalmente, l'ultimo "miglioramento" funzionerebbe solo per tabelle con chiavi surrogate. Ma indovina un po? Tutte le nostre tabelle che vale la pena controllare hanno una chiave del genere!

Altri suggerimenti

Ci sono molte altre cose che potresti voler controllare, come nomi di tabelle / colonne, computer / applicazione da cui è stato effettuato un aggiornamento e altro.

Ora, dipende da quanto è necessario un controllo dettagliato e a quale livello.

Abbiamo iniziato a creare la nostra soluzione di auditing basata su trigger e volevamo controllare tutto e anche avere un'opzione di ripristino a portata di mano. Questo si è rivelato troppo complesso, quindi abbiamo finito per decodificare lo strumento di terze parti basato su trigger ApexSQL Verifica per creare la nostra soluzione personalizzata.

Punte:

  • Includi valori prima / dopo

  • Includi 3-4 colonne per l'archiviazione della chiave primaria (nel caso in cui sia una chiave composita)

  • Archivia i dati al di fuori del database principale come già suggerito da Robert

  • Dedica una discreta quantità di tempo alla preparazione dei rapporti & # 8211; in particolare quelli di cui potresti aver bisogno per il recupero

  • Pianifica la memorizzazione del nome host / applicazione & # 8211; questo potrebbe rivelarsi molto utile per tracciare attività sospette

Registriamo anche i valori vecchi e nuovi e la colonna da cui provengono, nonché la chiave primaria della tabella controllata in una tabella dei dettagli di controllo. Pensi a cosa ti serve la tabella di controllo? Non solo vuoi sapere chi ha fatto una modifica e quando, ma quando si verifica una brutta modifica, vuoi un modo rapido per ripristinare i dati.

Durante la progettazione, è necessario scrivere il codice per recuperare i dati. Quando devi riprenderti, di solito è di fretta, meglio essere già preparati.

Ci sono molte risposte interessanti qui e in domande simili. Le uniche cose che posso aggiungere per esperienza personale sono:

  1. Metti la tua tabella di controllo in un altro database. Idealmente, si desidera la separazione dai dati originali. Se è necessario ripristinare il database, non si desidera ripristinare la pista di controllo.

  2. Denormalizza il più ragionevolmente possibile. Si desidera che la tabella abbia il minor numero di dipendenze possibile dai dati originali. La tabella di controllo dovrebbe essere semplice e veloce per recuperare i dati. Nessun join o ricerca di fantasia su altre tabelle per accedere ai dati.

Quello che abbiamo nella nostra tabella: -

Primary Key
Event type (e.g. "UPDATED", "APPROVED")
Description ("Frisbar was added to blong")
User Id
User Id of second authoriser
Amount
Date/time
Generic Id
Table Name

L'ID generico punta a una riga della tabella che è stata aggiornata e il nome della tabella è il nome di quella tabella come stringa. Non è un buon design DB, ma molto utilizzabile. Tutte le nostre tabelle hanno una singola colonna chiave surrogata, quindi funziona bene.

Esistono molti modi per farlo. Il mio modo preferito è:

  1. Aggiungi un campo mod_user alla tabella di origine (quella che desideri registrare).

  2. Crea una tabella di registro che contiene i campi che desideri registrare, oltre a un campo log_datetime e seq_num . seq_num è la chiave primaria.

  3. Crea un trigger sulla tabella di origine che inserisce il record corrente nella tabella di registro ogni volta che viene modificato un campo monitorato.

Ora hai una registrazione di ogni modifica e di chi è stata effettuata.

In generale, il controllo personalizzato (creazione di varie tabelle) è una cattiva opzione. I trigger di database / tabelle possono essere disabilitati per saltare alcune attività di registro. Le tabelle di controllo personalizzate possono essere manomesse. Possono verificarsi eccezioni che porteranno giù l'applicazione. Per non parlare delle difficoltà nel progettare una soluzione solida. Finora vedo casi molto semplici in questa discussione. È necessaria una separazione completa dal database corrente e da qualsiasi utente privilegiato (DBA, sviluppatori). Tutti i RDBMS tradizionali forniscono servizi di audit che persino i DBA non sono in grado di disabilitare, manomettendo il segreto. Pertanto, la funzionalità di controllo fornita dal fornitore RDBMS deve essere la prima opzione. Un'altra opzione sarebbe il lettore di log delle transazioni di terze parti o il lettore di log personalizzato che inserisce le informazioni decomposte nel sistema di messaggistica che finisce in alcune forme di Audit Data Warehouse o gestore di eventi in tempo reale. In sintesi: Solution Architect / " Hands on Data Architect " deve impegnarsi a destinare tale sistema in base ai requisiti. Di solito è roba troppo seria solo da consegnare a uno sviluppatore per la soluzione.

Secondo il principio di separazione:

  1. Le tabelle dei dati di controllo devono essere separate dal database principale. Poiché i database di controllo possono contenere molti dati storici, ha senso dal punto di vista dell'utilizzo della memoria tenerli separati.

  2. Non utilizzare i trigger per controllare l'intero database, perché finirai con un casino di database diversi da supportare. Dovrai scriverne uno per DB2, SQLServer, Mysql, ecc.

In ritardo alla festa, ma consiglio vivamente il progetto AutoAudit .
È al 100% gratuito e open source. È stato creato dagli MVP di SQL Paul Nielsen e John Sigouin. È molto stabile ed è attualmente nella versione 3.30.

Semplice da installare. Basta eseguire l'SP che forniscono. Creerà uno schema di audit, alcuni SP di manutenzione e i trigger necessari per eseguire il controllo. Da lì, basta scegliere quali tabelle si desidera controllare e con quali dettagli.

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