使用触发器进行审计
发布时间:2023-02-17 13:58:34 所属栏目:MySql教程 来源:
导读: 这是Complete SQL Mastery | Code with Mosh课程的第(十)章的一个记录和总结。
目录
触发器
这节课学习MySQL触发器,触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,通常
目录
触发器
这节课学习MySQL触发器,触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,通常
|
这是Complete SQL Mastery | Code with Mosh课程的第(十)章的一个记录和总结。 目录 触发器 这节课学习MySQL触发器,触发器是在插入、更新和删除语句前后自动执行的一堆SQL代码,通常我们使用触发器增强数据一致性。例如,在sql_store数据库中,一张发票可以对应好几笔付款,每当我们往付款表中录入一条新纪录,我们要确保发票表里的付款总计列更新了,这种情况下就可以使用触发器了。 DELIMITER $$ CREATE TRIGGER payments_after_insert AFTER INSERT ON payments FOR EACH ROW -- 触发器会作用于每一个受影响的程序 BEGIN -- 触发器主体,可以写任意SQL代码修改数据,来增强一致性 UPDATE invoices SET payment_total = payment_total + NEW.amount WHERE invoice_id = NEW.invoice_id; END $$ ? DELIMITER ; 可以修改payments表之外的任意表的数据。 删除某一行时的触发器 DELIMITER $$ CREATE TRIGGER payments_after_delete AFTER DELETE ON payments FOR EACH ROW BEGIN UPDATE invoices SET payment_total = payment_total - OLD.amount WHERE invoice_id = OLD.invoice_id; END $$ ? DELIMITER ; 查看触发器 在之前的课,我们已经创建好了一些触发器,但是,在MySQL Workbench中,我们不能在视觉上直观地看到已经创建好的触发器,我们可以用以下语句来查看当前数据库的所有触发器。'' SHOW TRIGGERS ? -- 筛选只和payments表有关的触发器 SHOW TRIGGERS LIKE 'payments%' 命名规则:table + before/after + insert/update/delete 删除触发器 DROP TRIGGER IF EXISTS payments_after_insert 使用触发器进行审计 现在已经学会了如何使用触发器去增强数据的一致性。触发器的另一个目的是记录对数据库的修改以用于审计。 例如,当一个人增加或删除了某条记录的时候,我们可以把这个操作记录下来,这样以后,回过头就知道是谁在什么时候做了什么操作 边门正触发改负触发接线图_相机软触发和硬触发_mysql触发器 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 ) 这里用CREATE语句建了个新表,执行这段代码,数据库会出现一张新表。 DELIMITER $$ CREATE TRIGGER payments_after_insert AFTER INSERT ON payments FOR EACH ROW BEGIN UPDATE invoices SET payment_total = payment_total + NEW.amount WHERE invoice_id = NEW.invoice_id; INSERT INTO payments_audit VALUES (NEW.client_id, NEW.date, NEW.amount,'Insert',NOW()); END $$ ? DELIMITER ; DELIMITER $$ CREATE TRIGGER payments_after_delete AFTER DELETE ON payments FOR EACH ROW BEGIN UPDATE invoices SET payment_total = payment_total - OLD.amount WHERE invoice_id = OLD.invoice_id; INSERT INTO payments_audit VALUES (OLD.client_id, OLD.date, OLD.amount,'Delete',NOW()); END $$ ? DELIMITER ; 事件 这节课来学习MySQL中的事件。事件是根据计划执行的任务或一堆SQL代码mysql触发器,你可以只执行一次,也可以按照某种规律执行,比如每天早上十点或者每月一次。所以通过事件,我们可以自动化数据库维护任务,比如删除已经过期的数据,或把数据从一张表复制到存档表,或者汇总数据生成报告。 在设计一个事件之前,我们首先要打开MySQL事件调度器,这是一个后台程序,它每时每刻都在寻找需要执行的事件。 SHOW VARIABLES -- 可以看到MySQL所有的系统变量 mysql触发器_边门正触发改负触发接线图_相机软触发和硬触发 我们只要找事件管理器变量 SHOW VARIABLES LIKE 'event%' ? -- 如果事件管理器被关闭了,可以打开 SET GLOBAL event_scheduler = ON -- 也可以关闭 SET GLOBAL event_scheduler = OFF 创建一个事件 DELIMITER $$ CREATE EVENT yearly_delete_stale_audio_rows ON SCHEDULE -- AT '2019-05-01' -- 执行一次 EVERY 1 YEAR STARTS '2019-01-01' ENDS '2029-01-01' DO BEGIN DELETE FROM payments_audit WHERE action_date < NOW() - INTERVAL 1 YEAR END $$ ? DELIMITER ; 查看、删除和更改事件 本节会讲如何查看、删除或者更改事件。 查看事件 SHOW EVENTS; 删除事件 DROP EVENT IF EXISTS yearly_delete_stale_audio_rows; 修改事件 DELIMITER $$ ALTER EVENT yearly_delete_stale_audio_rows ON SCHEDULE -- AT '2019-05-01' -- 执行一次 EVERY 1 YEAR STARTS '2019-01-01' ENDS '2029-01-01' DO BEGIN DELETE FROM payments_audit WHERE action_date < NOW() - INTERVAL 1 YEAR END $$ ? DELIMITER ; 也可以使用ALTER启用或者暂停事件 ALTER EVENT yearly_delete_stale_audio_rows DSIABLE; (编辑:PHP编程网 - 钦州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐




浙公网安备 33038102330484号