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
neboUPDATE
(neboDELETE
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.