Data audit Anda harus disimpan per-tabel, bukan semua di satu tempat. Yang akan Anda lakukan adalah membuat tabel audit untuk setiap tabel yang ingin Anda lacak, dan membuat pemicu untuk membuat catatan di tabel audit untuk operasi manipulasi data apa pun pada tabel yang diaudit.
Sangat disarankan untuk melarang DELETE
operasi pada items
dan item_options
tabel - tambahkan tanda seperti item_active
dan item_option_active
sehingga Anda dapat menghapusnya dengan lembut sebagai gantinya. Ini adalah praktik normal dalam situasi di mana Anda melakukan hal-hal seperti menyimpan faktur yang merujuk produk yang dipesan di masa lalu, dan memerlukan data untuk tujuan pelaporan historis, tetapi tidak untuk penggunaan sehari-hari.
Tabel audit Anda bukanlah sesuatu yang harus Anda gunakan untuk mereferensikan data lama, model data normal Anda seharusnya hanya mendukung "menyembunyikan" data lama yang kemungkinan masih akan digunakan, dan menyimpan beberapa versi data yang akan berubah seiring waktu.
Untuk audit, juga berguna untuk menyimpan nama pengguna pengguna terakhir untuk mengubah catatan yang diberikan - bila digunakan dari aplikasi web, Anda tidak dapat menggunakan USER()
MySQL berfungsi untuk mendapatkan informasi berguna tentang siapa yang masuk. Menambahkan kolom dan mengisinya berarti Anda dapat menggunakan informasi tersebut dalam pemicu audit Anda.
NB: Saya akan berasumsi bahwa Anda tidak akan mengizinkan ID item diubah dalam kondisi normal - itu akan membuat sistem audit Anda lebih kompleks.
Jika Anda menambahkan flag aktif, dan data yang terakhir diubah ke tabel Anda, mereka akan terlihat seperti:
Tabel item:
mysql> desc items;
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| item_name | varchar(100) | YES | | NULL | |
| item_description | text | YES | | NULL | |
| item_active | tinyint(4) | YES | | NULL | |
| modified_by | varchar(50) | YES | | NULL | |
+------------------+--------------+------+-----+---------+----------------+
Tabel opsi item:
mysql> desc item_options;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| option_id | int(11) | NO | PRI | NULL | auto_increment |
| item_id | int(11) | YES | MUL | NULL | |
| option_name | varchar(100) | YES | | NULL | |
| option_price | int(11) | YES | | NULL | |
| option_active | tinyint(4) | YES | | NULL | |
| modified_by | varchar(50) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
Tabel audit Anda perlu menyimpan empat informasi tambahan:
- ID Audit - ID ini hanya unik untuk riwayat ini tabel, ini bukan nilai global
- Perubahan yang dibuat oleh - pengguna database yang membuat perubahan
- Ubah tanggal/waktu
- Jenis tindakan -
INSERT
atauUPDATE
(atauDELETE
jika Anda mengizinkannya)
Tabel audit Anda akan terlihat seperti:
Tabel audit item:
mysql> desc items_audit;
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| audit_id | int(11) | NO | PRI | NULL | auto_increment |
| item_id | int(11) | YES | | NULL | |
| item_name | varchar(100) | YES | | NULL | |
| item_description | text | YES | | NULL | |
| item_active | tinyint(4) | YES | | NULL | |
| modified_by | varchar(50) | YES | | NULL | |
| change_by | varchar(50) | YES | | NULL | |
| change_date | datetime | YES | | NULL | |
| action | varchar(10) | YES | | NULL | |
+------------------+--------------+------+-----+---------+----------------+
Tabel audit opsi item:
mysql> desc item_options_audit;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| audit_id | int(11) | NO | PRI | NULL | auto_increment |
| option_id | int(11) | YES | | NULL | |
| item_id | int(11) | YES | | NULL | |
| option_name | varchar(100) | YES | | NULL | |
| option_price | int(11) | YES | | NULL | |
| option_active | tinyint(4) | YES | | NULL | |
| modified_by | varchar(50) | YES | | NULL | |
| change_by | varchar(50) | YES | | NULL | |
| change_date | datetime | YES | | NULL | |
| action | varchar(10) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
Jangan gunakan kunci asing pada tabel audit Anda; baris dalam tabel audit bukan baris turunan dari rekaman yang mereka audit, jadi kunci asing tidak berguna.
Pemicu
NB: MySQL tidak mendukung pemicu tipe multi-pernyataan, jadi Anda memerlukan satu untuk setiap INSERT
, UPDATE
dan DELETE
(jika berlaku).
Pemicu Anda hanya perlu INSERT
semua NEW
nilai ke dalam tabel audit. Definisi pemicu untuk items
tabel mungkin:
/* Trigger for INSERT statements on the items table */
CREATE DEFINER=`root`@`localhost` TRIGGER trigger_items_insert_audit
AFTER INSERT ON items
FOR EACH ROW BEGIN
INSERT INTO items_audit (
item_id, item_name, item_description,
item_active, modified_by, change_by,
change_date, action
) VALUES (
NEW.item_id, NEW.item_name, NEW.item_description,
NEW.item_active, NEW.modified_by, USER(),
NOW(), 'INSERT'
);
END;
/* Trigger for UPDATE statements on the items table */
CREATE DEFINER=`root`@`localhost` TRIGGER trigger_items_update_audit
AFTER UPDATE ON items
FOR EACH ROW BEGIN
INSERT INTO items_audit (
item_id, item_name, item_description,
item_active, modified_by, change_by,
change_date, action
) VALUES (
NEW.item_id, NEW.item_name, NEW.item_description,
NEW.item_active, NEW.modified_by, USER(),
NOW(), 'UPDATE'
);
END;
Buat pemicu serupa untuk item_options
tabel.
Pembaruan:Riwayat Data Dalam E-niaga
Audit yang kami lakukan di atas akan memungkinkan Anda untuk menyimpan riwayat dari tabel database yang diberikan, tetapi membuat penyimpanan data yang tidak sesuai untuk digunakan untuk data yang perlu diakses secara teratur.
Dalam sistem e-niaga, menjaga agar dapat digunakan data historis penting, sehingga Anda dapat mengubah atribut sambil tetap menampilkan nilai lama dalam situasi tertentu.
Ini harus benar-benar terpisah dari solusi audit Anda
Cara terbaik untuk menyimpan riwayat adalah dengan membuat tabel riwayat untuk setiap atribut yang perlu disimpan secara historis. Pertanyaan Stackoverflow ini memiliki beberapa informasi bagus tentang menyimpan riwayat atribut tertentu .
Dalam situasi Anda, jika Anda hanya memperhatikan harga dan judul, Anda akan membuat prices
tabel, dan item_titles
meja. Masing-masing akan memiliki kunci asing untuk item_options
tabel atau items
tabel (tabel master masih akan menyimpan saat ini harga, atau judul), dan akan memiliki harga atau judul, dengan tanggal efektifnya. Tabel ini harus memiliki izin terperinci (mungkin berbasis kolom) untuk menghindari pembaruan effective_from
tanggal, dan nilai aktual setelah catatan dimasukkan.
Anda juga harus menggunakan solusi audit di atas pada tabel ini.