加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 钦州站长网 (https://www.0777zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

使用触发器进行审计

发布时间:2023-02-17 13:58:34 所属栏目:MySql教程 来源:
导读:  这是Complete SQL Mastery | Code with Mosh课程的第(十)章的一个记录和总结。

  目录

  触发器

  这节课学习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编程网 - 钦州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!