Saat ini saya ingin menyusun tabel pelacakan / riwayat seperti ini:
- PrimaryKey - ID
- OtherTableId - fk
- fieldName - nama bidang yang dilacak
- OldValue
- Nilai baru
- Nama pengguna
- CreateDateTime
Jadi pada dasarnya saya ingin memiliki tabel yang akan melacak sejarah tabel lain, menyimpan nama kolom bidang yang diubah dengan nilai baru dan lama. Pertanyaan saya, adakah yang bisa melubangi ini? Juga, apa cara termudah untuk memastikan bahwa hanya nama kolom dari tabel pelacakannya dimasukkan ke kolom fieldName? Saat ini opsi saya adalah memiliki enum di layanan yang saya buat, atau membuat tabel status lain dan menjadikan fieldName sebagai fk. Ada ide yang lebih baik?
Sunting Sasaran: Saat ini hanya ada 2 bidang yang ingin kami lacak. Satu bidang akan ditampilkan pada halaman web untuk menampilkan riwayat, bidang lainnya hanya akan diakses oleh satu departemen dan mereka memiliki akses ke tampilan database yang dapat mereka query. Mereka akan menanyakan hanya satu bidang ini untuk mendapatkan informasi tentang siapa yang mengubah bidang dan apa yang harus dilakukan. Ini adalah alasan kami ingin mengaturnya di mana bidang database mendefinisikan kolom tabel daripada memiliki salinan yang tepat dari sejarah catatan tabel. Kami hanya ingin dua bidang dilacak dengan kemungkinan menambah atau menghapus bidang di masa mendatang.
Terima kasih!
Jawaban:
Lubang berlubang: bagaimana jika skema basis data diubah pada titik yang sama di kemudian hari, dan nama kolom berubah, atau kolom dihapus sepenuhnya? Banyak sistem basis data memungkinkan ini. Apa yang akan terjadi dengan "fieldName" Anda?
Untuk integritas data: Anda harus memastikan bahwa setiap operasi pembaruan atau penghapusan pasti akan memperbarui tabel pelacakan Anda. Itu paling baik dilakukan dengan pemicu memanggil prosedur tersimpan. Anda harus memastikan hanya prosedur tersimpan yang memiliki akses tertulis ke tabel pelacakan Anda, sehingga tidak ada orang lain yang dapat menulis nilai yang salah.
Jika Anda dapat hidup dengan solusi spesifik vendor db: sebagian besar sistem db memiliki tabel sistem tempat informasi skema (nama tabel, id tabel, nama kolom, dll) disimpan. Anda dapat memeriksa apakah mungkin untuk menetapkan referensi kunci asing ke tabel sistem tersebut. Itu akan memungkinkan untuk mengganti nama bidang dengan ID bidang jika database mendukung sesuatu seperti ini.
Sebenarnya, jika Anda perlu melacak seluruh baris tabel spesifik termasuk semua kolom (dan bukan hanya sebagian kecil dari kolom), Anda harus mempertimbangkan saran @ sarfeast. Baca artikel ini tentang kelemahan dari model pasangan nama-nilai.
sumber
Implementasi audit perubahan (pelacakan riwayat) yang paling sukses yang pernah saya lihat kurang generik dan jauh lebih sederhana. Ini melibatkan membuat tabel log perubahan untuk setiap tabel yang ingin Anda pantau, menjaga nama kolom dan tipe data yang identik (dengan kolom tambahan untuk cap waktu).
Tujuan akhirnya, yaitu, apa yang ingin Anda lakukan dengan data yang diaudit akan membantu mengevaluasi seberapa cocok masing-masing pendekatan.
sumber
Singkatnya: Anda perlu mengatur mekanisme Jejak Audit untuk tabel yang ingin Anda lacak perubahan nilainya.
Tabel jejak audit tunggal :
Berikut ini adalah pos yang bagus dengan skrip tentang cara mencapainya - Membuat Jejak Audit
Referensi lain yang bermanfaat untuk dilihat:
sumber
Anda mungkin ingin melihat-lihat dokumentasi proyek NHibernate Envers .
Pada dasarnya, Anda memiliki satu tabel revisi di mana Anda dapat menambahkan data tambahan seperti cap waktu atau pengguna. Kemudian, setiap tabel yang Anda lacak mendapat tabel audit tambahan dengan semua kolom digandakan, sebuah fk ke tabel revisi, dan jenis revisi (tambah, ubah, hapus). AFAIK, Anda tidak ingin tabel audit Anda memiliki FK yang sebenarnya untuk tabel nyata karena itu akan mencegah penghapusan.
sumber