CREATE TRIGGER payments_after_insert -- trigger命名:要触发触发器的表和对应触发操作顺序以及对应操作 AFTER INSERT ON payments FOR EACH ROW -- 每更新一行就会对这一行触发,更新多行就会触发多次,有些dbms支持表级别的,即表只触发一次。 BEGIN UPDATE invoices SET payment_total = payment_total + NEW.amount -- NEW表示自动获取新插入数据amount的值 WHERE invoice_id = NEW.invoice_id; END $$
CREATE TABLE payments_audit ( client_id INT NOT NULL, date DATE NOT NULL, amount DECIMAL(9, 2) NOT NULL, action_type VARCHAR(50) NOT NULL, action_date DATETIME NOT NULL )
然后修改触发器,使其触发后增加操作记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
DROP TRIGGER IF EXISTS payments_after_insert; DELIMITER $$
CREATE TRIGGER payments_after_insert -- trigger命名:要触发触发器的表和对应触发操作顺序以及对应操作 AFTER INSERT ON payments FOR EACH ROW -- 每更新一行就会对这一行触发,更新多行就会触发多次,有些dbms支持表级别的,即表只触发一次。 BEGIN UPDATE invoices SET payment_total = payment_total + NEW.amount -- NEW表示自动获取新插入数据amount的值 -- 当采用的是删除后触发,就需要改成"OLD.字段" WHERE invoice_id = NEW.invoice_id; INSERT INTO payments_audit VALUES(NEW.client_id, NEW.date, NEW.amount, 'insert', NOW()); END $$
mysql> SHOW VARIABLES LIKE 'event%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+ 1 row in set, 1 warning (0.00 sec)
通过以下代码可以将其启动:
1
SET GLOBAL event_scheduler = ON/OFF;
写代码创建一个事务,删除所有超过一年的审计记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
DELIMITER $$
CREATE EVENT yearly_delete_stale_audit_rows ON SCHEDULE -- AT '2021-04-16' 如果我们只想执行一次就用AT EVERY 1 YEAR STARTS '2021-04-15' ENDS '2022-10-15' DO BEGIN DELETE FROM payments_audit WHERE action_date < NOW() - INTERVAL 1 YEAR; -- DATEADD(NOW(),INTERVAL -1 YEAR) -- DATESUB(NOW(),INTERVAL 1 YEAR) 和上面的意义一样,都是前年的日期,删除所有超过一年的触发审计记录 END $$
DELIMITER ;
查看、删除、更改事件
查看当前database的事件:
1 2
SHOW EVENTS; SHOW EVENTS LIKE 'yearly%'; -- 查看以yearly开头的事件
删除事件:
1
DROP EVENTS IF EXISTS yearly_delete_stale_audit_rows;
修改事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
DELIMITER $$
ALTER EVENT yearly_delete_stale_audit_rows ON SCHEDULE -- AT '2021-04-16' 如果我们只想执行一次就用AT EVERY 1 YEAR STARTS '2021-04-15' ENDS '2022-10-15' DO BEGIN DELETE FROM payments_audit WHERE action_date < NOW() - INTERVAL 1 HOUR; -- DATEADD(NOW(),INTERVAL -1 HOUR) -- DATESUB(NOW(),INTERVAL 1 HOUR) 修改事件为删除所有超过1h前的触发审计记录 END $$
DELIMITER ;
还可以禁用或者启用事件:
1
ALTER EVENT yearly_delete_stale_audit_rows DISABLE -- ENABLE