sql >> Databasteknik >  >> RDS >> Mysql

Är detta det bästa sättet att skapa ett revisionsspår?

Jag är inte säker på att det finns ett "bästa tillvägagångssätt", det finns så många variabler att ta hänsyn till, inklusive hur långt ner på utvecklingsvägen du är.

Efter att ha gått igenom både kodbaserade och db-trigger revisionslösningar, har jag listat några kommentarer nedan; Jag hoppas att du kan se var du är nu (i termer av utveckling) kan påverka dessa frågor:

  • Om du behöver kartlägga användaren som ändrade data (vilket du vanligtvis gör) så kommer db triggers att behöva få denna information på något sätt. Inte omöjligt, men mer arbete och flera sätt att närma sig detta (db-användare som kör fråga, gemensam användarkolumn i varje tabell, etc.)
  • Om du använder db-utlösare och du förlitar dig på antalet påverkade rader som returneras från frågor, måste dina granskningsutlösare ha detta avstängt eller din befintliga kod modifierad för att ta hänsyn till dem.
  • IMHO db-utlösare erbjuder mer säkerhet och erbjuder en enklare väg till revisionsautomatisering, men de är inte idiotsäkra, eftersom alla med lämplig åtkomst kan inaktivera utlösarna, ändra data och sedan aktivera dem igen. Med andra ord, se till att dina åtkomsträttigheter för db-säkerhet är snäva.
  • Att ha en enda tabell för historik är inte en dålig väg att gå, även om du kommer att ha mer arbete att göra (och data att lagra) om du granskar historik för flera tabeller, särskilt när det gäller att rekonstruera revisionsspåret. Du måste också överväga låsningsproblem om det finns många tabeller som försöker skriva till en granskningstabell.
  • Att ha en granskningshistoriktabell för varje tabell är ett annat alternativ. Du behöver bara varje kolumn i granskningstabellen vara nullbar, samt lagra datum och tid för åtgärden (infoga/uppdatera/ta bort) och användaren som är kopplad till åtgärden.
  • Om du väljer alternativet för enkelbord, såvida du inte har mycket tid att lägga på detta, ska du inte bli för sugen på att försöka granska endast uppdateringar eller borttagningar, även om det kan vara frestande att undvika infogningar (eftersom de flesta appar gör detta oftare än uppdateringar eller raderingar), att rekonstruera revisionshistoriken kräver en hel del arbete.
  • Om dina servrar eller data sträcker sig över flera tidszoner, överväg att använda en lämplig datetime-typ för att kunna lagra och rekonstruera tidslinjen, dvs. lagra revisionshändelsedatum i UTC samt inkludera tidszonsförskjutningen.
  • Dessa granskningstabeller kan bli enorma, så ha en strategi om de börjar påverka prestandan. Alternativen inkluderar tabellpartitionering på olika skivor, arkivering etc. Tänk i princip på detta nu och inte när det blir ett problem :)


  1. Uppdatera flera rader med flera "where"-satser för varje enskild rad

  2. SQL Server - hitta den n:e förekomsten i en sträng

  3. mySQL SELECT kommande födelsedagar

  4. C# ringer oracle lagrad funktion