Θα πρέπει πρώτα να σκεφτείς τί θα το κάνεις αυτό το audit trail. Όπως λέει και ο Kelman, πρώτα σχεδίασε τί θέλεις να κάνεις και μετά σκέψου πως θα το υλοποιήσεις.
Συνήθως, τα audit trails υπάρχουν για να διαβάζονται από κάποιον admin. Άλλοτε, υπάρχουν για να εκτυπώνονται αναφορές για έλεγχο στο τέλος της ημέρας. Άλλες φορές, υπάρχουν για να ικανοποιείται ο πελάτης ότι υπάρχει και αυτό.
Για τη τρίτη περίπτωση αρκεί να γράψεις βρεις κάπως τα δεδομένα που άλλαξαν και να τα γράψεις κάπου. Όταν όμως πάει κάποιος να χρησιμοποιήσει το audit trail θα τα βρει μπαστούνια, καθώς θα βλέπει μεν ποιά είναι τα δεδομένα που άλλαξαν, αλλά δεν θα ξέρει το γιατί. Σε αυτή την περίπτωση μπορείς άνετα να πάρεις τις αλλαγές με την GetChanges και να τις κάνεις serialize σε ένα XML.
Για την πρώτη περίπτωση, θα πρέπει να καταχωρήσεις επιπλέον πληροφορίες, όπως το τί έκανε ο χρήστης, π.χ. "Δημιουργία χρήστη", και τα δεδομένα με μορφή που να έχει νόημα, π.χ. username, roles assigned κλπ. Δεν αρκεί απλά να βάλεις τις τιμές, πρέπει να έχουν μία μορφή που να έχει νόημα για τον admin. Επίσης, θα πρέπει να βάλεις και τις ΠΡΙΝ και τις ΜΕΤΑ τιμές, για να μπορεί να καταλάβει ο admin τί έγινε. Σε μεγάλο βαθμό βέβαια μπορείς την ωραία παρουσίαση να την κάνεις σε ένα audit viewer ή σε ένα audit report.
Τέλος, καλό είναι να αποθηκεύεις και κάποιο SessionID για να μπορούν να συνδεθούν οι ενέργειες ενός χρήστη μεταξύ τους.
Κάτι άλλο που πρέπει να σκεφτείς, είναι που θα γίνει το auditing. Αν γίνεται στον client μπορεί κάποιος χρήστης να χτυπήσει τη βάση απευθείας με ένα query editor και να πειράξει τους πίνακες. Σε αυτή την περίπτωση θα πρέπει να υλοποιηθεί το auditing μέσω triggers, κάτι που είναι ολίγον μπελάς. Αν μεσολαβούν server components (COM+, Enterprise Service, Remoting ή WCF) μπορείς να κάνεις το audit σε αυτά και να επιτρέψεις την πρόσβαση στη βάση μόνο μέσω αυτών.
Επίσης θα πρέπει να σκεφτείς τί θα κάνεις audit. Το καλύτερο είναι να κάνεις audit τα business actions, όπως στο παράδειγμα του χρήστη, και όχι τις επιμέρους αλλαγές που έκανε η εφαρμογή. Ο πιο ευέλικτος τρόπος να κάνεις audit είναι στα server components να καταγράφεις την ενέργεια και τις παραμέτρους της. Αν π.χ. έχεις ένα component UserManager, όταν ολοκληρωθεί η κλήση της CreateUser και πριν κάνεις commit το transaction, κάνεις και την καταγραφή στο audit trail.
Αν υποθέσουμε ότι δεν έχεις server components μία καλή τακτική θα ήταν να αποθηκεύεις την ενέργεια (π.χ. διαγραφή χρήστη), χρόνο κλπ., τις παραμέτρους και σε μοργή XML το τροποποιημένο Dataset, απλά και μόνο σαν reference.
Ακόμα καλύτερο όμως θα ήταν να χρησιμοποιήσεις το Logging Application Block του Enterprise Library. Μαζεύει μόνο του τα περισσότερα στοιχεία (π.χ. ώρα, μηχάνημα, session ID, IP κλπ), μπορεί να αποθηκεύσει τα δεδομένα σε πολλές μορφές (αρχείο, βάση, ακόμα και email στέλνει) και το μόνο που καλείς στο τέλος είναι ένα ... Logger.WriteEntry()
Σε αυτό μπορείς να καταχωρήσεις ένα επεξηγηματικό κείμενο, κατηγορία, event κλπ και επιπλέον δεδομένα (π.χ. παραμέτρους της ενέργειας) σαν dictionary. Την σωστή αποθήκευση τους την αναλαμβάνει η βιβλιοθήκη. Μπορείς μάλιστα να ορίσεις ότι οι παράμετροι θα αποθηκεύονται ακόμα και στη βάση ως XML και μετά να κάνεις query σε αυτό το XML για να φτιάξεις τα report που θέλεις.
Προσωπικά έχω χρησιμοποιήσει το Logging Block με αυτό ακριβώς τον τρόπο, για να καταγράφω εισερχόμενες εντολές από άλλα συστήματα. Κάθε φορά που ερχόταν ένα μήνυμα έκανα μία εγγραφή κατά την εκκίνηση και τη λήξη της επεξεργασίας αποθηκεύοντας τα περιεχόμενα της εντολής στο dictionary. Μετά ρύθμισα το logging να γίνεται και σε αρχείο και στη βάση με το dictionary να αποθηκεύεται σε XML. Έτσι μπορούσα να κάνω queries για να δω πόσες εντολές πέτυχαν ή απέτυχαν ανά ημέρα, κλπ.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos