sql >> Databáze >  >> RDS >> Mysql

Auditovat protokolování údajů o produktech?

Vaše auditní data by měla být uložena pro jednotlivé tabulky, nikoli všechna na jednom místě. Co byste udělali, je vytvořit tabulku auditu pro každou z tabulek, kterou chcete sledovat, a vytvořit spouštěče pro vytvoření záznamu v tabulce auditu pro jakoukoli operaci manipulace s daty v auditované tabulce.

Rozhodně je vhodné zakázat DELETE operace s items a item_options tabulky – přidejte příznaky jako item_active a item_option_active abyste je místo toho mohli vymazat. To je běžná praxe v situacích, kdy děláte věci, jako je ukládání faktur, které odkazují na produkty objednané v minulosti, a potřebujete data pro účely historických zpráv, ale ne pro každodenní použití.

Vaše auditní tabulky nejsou něčím, co byste měli používat pro odkazování na stará data, váš běžný datový model by měl podporovat jednoduché „skrytí“ starých dat tam, kde je pravděpodobné, že se budou stále používat, a ukládání více verzí dat, které se časem změní.

Pro audit je také užitečné uložit uživatelské jméno posledního uživatele, který daný záznam upravoval – při použití z webové aplikace nelze použít USER() MySQL. k získání užitečných informací o tom, kdo je přihlášen. Přidání sloupce a jeho vyplnění znamená, že tyto informace můžete použít ve spouštěčích auditu.

Poznámka: Předpokládám, že za normálních podmínek nedovolíte měnit ID položek – to by váš systém auditu učinilo složitějším.

Pokud do svých tabulek přidáte aktivní příznaky a data naposledy změněná, budou vypadat nějak takto:

Tabulka položek:

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    |                |
+------------------+--------------+------+-----+---------+----------------+

Tabulka možností položek:

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    |                |
+---------------+--------------+------+-----+---------+----------------+

Vaše auditní tabulky potřebují uchovávat čtyři další informace:

  • ID auditu – toto ID je jedinečné pouze pro historii tohoto tabulka, nejde o globální hodnotu
  • Změnu provedl – uživatel databáze, který změnu provedl
  • Změnit datum/čas
  • Typ akce – INSERT nebo UPDATE (nebo DELETE pokud byste to dovolili)

Vaše auditní tabulky by měly vypadat nějak takto:

Tabulka auditu položek:

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    |                |
+------------------+--------------+------+-----+---------+----------------+

Tabulka auditu možností položky:

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    |                |
+---------------+--------------+------+-----+---------+----------------+

Nepoužívejte cizí klíče v auditních tabulkách; řádky v tabulkách auditu nejsou podřízené řádky záznamů, které auditují, takže cizí klíče nejsou k ničemu.

Spouštěče

Poznámka: MySQL nepodporuje spouštěče typu více příkazů, takže pro každý z INSERT potřebujete jeden , UPDATE a DELETE (pokud existuje).

Vaše spouštěče stačí INSERT všechny NEW hodnoty do auditní tabulky. Definice spouštěčů pro items tabulka může být:

/* 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;

Vytvořte podobné spouštěče pro item_options tabulka.

Aktualizace:Historie dat v elektronickém obchodování

Audit, který jsme provedli výše, vám umožní uchovávat historii jakékoli dané databázové tabulky, ale vytvoří úložiště dat, které není vhodné pro data, ke kterým je potřeba pravidelně přistupovat.

V systému elektronického obchodování, zachování použitelnosti historická data jsou důležitá, abyste mohli v určitých situacích měnit atributy a přitom stále prezentovat staré hodnoty.

To by mělo být zcela oddělené od vašeho řešení auditu

Nejlepší způsob, jak uložit historii, je vytvořit tabulku historie pro každý atribut které je třeba historicky uložit. Tato otázka Stackoverflow obsahuje dobré informace o uchovávání historie daného atributu .

Ve vaší situaci, pokud vás zajímá pouze cena a název, vytvořili byste prices tabulka a item_titles stůl. Každý z nich by měl cizí klíč k buď item_options tabulka nebo items tabulka (hlavní tabulky by stále uchovávaly aktuální cena nebo titul) a bude mít cenu nebo titul s daty účinnosti. Tyto tabulky by měly mít podrobná oprávnění (možná založená na sloupcích), aby se zabránilo aktualizaci effective_from data a skutečné hodnoty po vložení záznamu.

Měli byste také použít řešení auditování výše v těchto tabulkách.



  1. jak používat funkci string left v hql

  2. PHP:mysql v mysqli v pdo

  3. Propojení mysqldump do mysql

  4. Podivný problém s řazením v PHP, mysql s daty utf8