Saya perlu membuat tabel database untuk menyimpan log perubahan / audit yang berbeda (ketika ada sesuatu yang ditambahkan, dihapus, dimodifikasi, dll). Saya tidak perlu menyimpan info yang sangat rinci, jadi saya memikirkan sesuatu seperti:
- id (untuk acara)
- pengguna yang memicunya
- nama acara
- Deskripsi acara
- stempel waktu acara
Apakah saya melewatkan sesuatu di sini? Jelas saya dapat terus meningkatkan desain, meskipun saya tidak berencana untuk membuatnya rumit (membuat tabel lain untuk jenis acara atau hal-hal seperti itu tidak mungkin dilakukan karena ini merupakan komplikasi untuk kebutuhan saya).
database
database-design
audit
rcphq
sumber
sumber
Jawaban:
Dalam proyek yang saya kerjakan, log audit juga dimulai dari desain yang sangat minimalis, seperti yang Anda jelaskan:
Idenya sama: untuk membuat segalanya tetap sederhana.
Namun, dengan cepat menjadi jelas bahwa desain minimalis ini tidak cukup. Audit tipikal bermuara pada pertanyaan-pertanyaan seperti ini:
Jadi, untuk dapat menjawab pertanyaan semacam itu dengan cepat (menggunakan SQL), kami akhirnya memiliki dua kolom tambahan di tabel audit.
Saat itulah desain log audit kami benar-benar stabil (untuk beberapa tahun sekarang).
Tentu saja, "perbaikan" terakhir hanya akan bekerja untuk tabel yang memiliki kunci pengganti. Tapi coba tebak? Semua tabel kami yang layak diaudit memang memiliki kunci seperti itu!
sumber
Kami juga mencatat nilai lama dan baru dan dari kolom asalnya serta kunci utama dari tabel yang diaudit dalam tabel detail audit. Pikirkan untuk apa Anda membutuhkan tabel audit? Anda tidak hanya ingin tahu siapa yang membuat perubahan dan kapan, tetapi ketika perubahan buruk terjadi, Anda menginginkan cara cepat untuk mengembalikan data.
Saat Anda mendesain, Anda harus menulis kode untuk memulihkan data. Ketika Anda perlu pulih, biasanya terburu-buru, lebih baik sudah bersiap.
sumber
Ada beberapa hal lagi yang mungkin ingin Anda audit, seperti nama tabel / kolom, komputer / aplikasi tempat pembaruan dibuat, dan banyak lagi.
Sekarang, ini tergantung pada seberapa rinci audit yang benar-benar Anda butuhkan dan pada level apa.
Kami mulai membangun solusi audit berbasis pemicu kami sendiri, dan kami ingin mengaudit semuanya dan juga memiliki opsi pemulihan. Ini ternyata terlalu rumit, jadi kami akhirnya merekayasa balik Audit ApexSQL alat pihak ketiga berbasis pemicu untuk membuat solusi khusus kami sendiri.
Tips:
Sertakan nilai sebelum / sesudah
Sertakan 3-4 kolom untuk menyimpan kunci utama (jika itu adalah kunci komposit)
Simpan data di luar database utama seperti yang telah disarankan oleh Robert
Luangkan banyak waktu untuk menyiapkan laporan - terutama yang mungkin Anda perlukan untuk pemulihan
Rencanakan untuk menyimpan nama host / aplikasi - ini mungkin berguna untuk melacak aktivitas yang mencurigakan
sumber
Ada banyak jawaban menarik di sini dan di pertanyaan serupa. Satu-satunya hal yang dapat saya tambahkan dari pengalaman pribadi adalah:
Letakkan tabel audit Anda di database lain. Idealnya, Anda menginginkan pemisahan dari data asli. Jika Anda perlu memulihkan database Anda, Anda tidak benar-benar ingin memulihkan jejak audit.
Denormalisasikan sebanyak mungkin. Anda ingin tabel memiliki dependensi sesedikit mungkin ke data asli. Tabel audit harus sederhana dan secepat kilat untuk mengambil data. Tidak ada gabungan atau pencarian mewah di tabel lain untuk mendapatkan data.
sumber
Apa yang kami miliki di tabel kami: -
Id generik menunjuk pada sebuah baris dalam tabel yang telah diperbarui dan nama tabel adalah nama tabel itu sebagai string. Bukan desain DB yang bagus, tapi sangat berguna. Semua tabel kami memiliki satu kolom kunci pengganti sehingga ini berfungsi dengan baik.
sumber
Secara umum, audit khusus (membuat berbagai tabel) adalah opsi yang buruk. Pemicu database / tabel dapat dinonaktifkan untuk melewati beberapa aktivitas log. Tabel audit khusus dapat dirusak. Pengecualian dapat terjadi yang akan menurunkan penerapan. Belum lagi kesulitan merancang solusi yang kuat. Sejauh ini saya melihat kasus yang sangat sederhana dalam diskusi ini. Anda memerlukan pemisahan lengkap dari database saat ini dan dari pengguna yang memiliki hak istimewa (DBA, Pengembang). Setiap RDBMS arus utama menyediakan fasilitas audit yang bahkan DBA tidak dapat menonaktifkannya, merusak secara rahasia. Oleh karena itu, kemampuan audit yang disediakan oleh vendor RDBMS harus menjadi pilihan pertama. Pilihan lainnya adalah pembaca log transaksi pihak ketiga atau pembaca log kustom yang mendorong informasi yang diuraikan ke dalam sistem pesan yang berakhir di beberapa bentuk Gudang Data Audit atau pengendali peristiwa waktu nyata. Singkatnya: Arsitek Solusi / "Arsitek Data Hands on" perlu terlibat dalam menentukan sistem seperti itu berdasarkan persyaratan. Biasanya terlalu serius untuk diserahkan kepada pengembang untuk mendapatkan solusi.
sumber
Ada banyak cara untuk melakukan ini. Cara favorit saya adalah:
Tambahkan
mod_user
bidang ke tabel sumber Anda (yang ingin Anda catat).Buat tabel log yang berisi bidang yang ingin Anda catat, ditambah bidang
log_datetime
danseq_num
.seq_num
adalah kunci utama.Buat pemicu pada tabel sumber yang menyisipkan rekaman saat ini ke dalam tabel log setiap kali bidang yang dipantau berubah.
Sekarang Anda memiliki catatan tentang setiap perubahan dan siapa yang membuatnya.
sumber
Menurut prinsip pemisahan:
Tabel data audit harus terpisah dari database utama. Karena database audit dapat memiliki banyak data historis, maka masuk akal dari sudut pandang penggunaan memori untuk memisahkannya.
Jangan gunakan pemicu untuk mengaudit seluruh database, karena Anda akan berakhir dengan kekacauan database yang berbeda untuk didukung. Anda harus menulis satu untuk DB2, SQLServer, Mysql, dll.
sumber