I create a separate table and then store each field change in there.
So I have a layout similar to this:
ID-TableName-FieldName-oldValue-NewValue-UserID-CreatedDate
And then I have triggers on all the tables that a user can edit (we store UserID modified etc on those tables, but sometimes need to trace who exactly changed what to what)
I use sqlvariants for the values. So I don't have to worry about data types. So the triggers are just a copy/paste each time essentially.
Once it's setup I can monitor the little sons of bitches like there's no tomorrow.
"Who made that deal live?"
"Not us, we didn't do nothing?"
"Really? Your supervisor was the last one to edit it"
Supervisor: "No I didn't do anything to it"
*Audit logs*
"Really? Cause it says here Ms Data Capturer #1 changed the record to x and then to y and when it's y it locks for normal Data Capturers and needs a Supervisor to unlock it but it seems you forgot to take it off the approved deal system"
"Oh, yes, noooooow I remember..." <-- ahu
