From 608cc553227d945e244eb4c174fb1d959a576609 Mon Sep 17 00:00:00 2001 From: Mars Liu Date: Fri, 27 May 2022 17:52:30 +0800 Subject: [PATCH] trigger --- .../audit.json" | 7 ++ .../audit.md" | 87 +++++++++++++++++++ gears/sql/trigger.sql | 21 +++++ 3 files changed, 115 insertions(+) create mode 100644 "data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.json" create mode 100644 "data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.md" create mode 100644 gears/sql/trigger.sql diff --git "a/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.json" "b/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.json" new file mode 100644 index 0000000..ce21cbc --- /dev/null +++ "b/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": "ccat", + "source": "audit.md", + "notebook_enable": false, + "exercise_id": "457f6b7e9b2b4eb58d15f12cb21a1463" +} \ No newline at end of file diff --git "a/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.md" "b/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.md" new file mode 100644 index 0000000..4a1e608 --- /dev/null +++ "b/data/2.MySQL\344\270\255\351\230\266/1.\346\225\260\346\215\256\345\272\223\347\273\204\346\210\220/6. \350\247\246\345\217\221\345\231\250/audit.md" @@ -0,0 +1,87 @@ +# 交易审计 + +Orders 表 + +```mysql +create table orders +( + id int primary key auto_increment, + item_id int, + amount int, + unit_price decimal(12, 4), + total decimal(12, 4), + description varchar(2000), + ts timestamp default now() +); +``` + +记录了未完成的订单。审计部门现在需要记录其变更——新增或删除,该表不会发生update——即将修改都记录到 orders_log 表 + +```mysql +create table orders_log +( + id int primary key auto_increment, + item_id int, + amount int, + unit_price decimal(12, 4), + total decimal(12, 4), + description varchar(2000), + ts timestamp, + direction varchar(16), + log_at timestamp default now() +); +``` + +那么应该如何做? + +## 答案 + +```mysql +create trigger in_orders after insert on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in'); + +create trigger out_orders after delete on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out'); +``` + +## 选项 + +### A + +```mysql +create trigger in_orders after insert on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in'); + +``` + +### B + +```mysql + +create trigger out_orders after delete on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out'); +``` + + +### C + +```mysql +create trigger in_orders after insert on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in'); + after delete on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out'); +``` + +### D + +```mysql +create trigger in_orders after insert, after delete on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in'); +``` \ No newline at end of file diff --git a/gears/sql/trigger.sql b/gears/sql/trigger.sql new file mode 100644 index 0000000..8a4ad57 --- /dev/null +++ b/gears/sql/trigger.sql @@ -0,0 +1,21 @@ +create table orders_log +( + event_id int primary key auto_increment, + id int, + item_id int, + amount int, + unit_price decimal(12, 4), + total decimal(12, 4), + description varchar(2000), + ts timestamp, + direction varchar(16), + log_at timestamp default now() +); + +create trigger in_orders after insert on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in'); + +create trigger out_orders after delete on orders + for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction) + values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out'); \ No newline at end of file -- GitLab