Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Audit logging untuk data produk?

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 atau UPDATE (atau DELETE 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan MySql untuk mengambil nilai atribut elemen xml

  2. Bagaimana Anda terhubung ke beberapa database MySQL pada satu halaman web?

  3. Sistem Login/Registrasi dengan php dan mysql

  4. Optimasi database MYSQL menggunakan pengindeksan

  5. PHP Cara terbaik untuk men-cache hasil MySQL?