数据库——审计及触发器

智能2112杨阳  

一、目的与要求:

1.了解MySQL审计功能及实现方式

2.掌握触发器的工作原理、定义及操作方法

二、内容:

注:

  1. 在同一个触发器内编写多行代码,需要用结构begin ……end
  2. 函数current_user()获得当前登录用户名

1.自动保存对所有表(至少fruits表和orderitems表)的插入、更新、删除操作到opertaion表中。

增加opertaion

表1   opertaion表结构

字段名

字段说明

数据类型

主键

外键

非空

唯一

自增

id

ID号

int (11)

Y

N

Y

Y

Y

tablename

表名

varchar (50)

N

N

Y

N

N

opname

操作类型

varchar (50)

N

N

Y

N

N

optime

操作时间

datetime

N

N

Y

N

N

ConnUser

用户名

varchar(30)

N

N

Y

N

N

源码:

create table operation(

    id int(11) not null unique auto_increment,

    tablename varchar(50) not null,

    opname varchar(50) not null,

    -optime datetime not null,

    ConnUser varchar(30) not null,

primary key(id));

②创建基于fruitsorderitems插入、更新、删除触发器,该类触发器的功能是在执行相关操作时把操作相关信息写入opertaion表中。例如在fruits表中成功插入一项新的元组后,在opertaion表中自动增加一个元组,该元组描述了是对fruits表进行了插入操作。

源码:

create trigger insert_f after insert on fruits for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','insert',now(),current_user());

create trigger update_f after update on fruits for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','insert',now(),current_user());

create trigger delete_f after delete on fruits for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','insert',now(),current_user());

create trigger insert_oi after insert on orderitems for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','insert',now(),current_user());

create trigger update_oi after update on orderitems for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','update',now(),current_user());

create trigger delete_oi after delete on orderitems for each row

insert into operation(tablename,opname,optime,ConnUser) values('fruits','delete',now(),current_user());

 

 

 

 

 

测试:用B001帐号(即销售人员帐号)登录,在fruits表中插入一条水果信息,再查看opertaion表是否实现自动添加更新记录。

运行测试结果截图:

insert into fruits values('o1',103,'cantaloupe',7.80,1000);

2. 实现自动更新fruits表中商品数量

在fruits表中增加一个属性quantity(库存商品数量) ,数据类型int(5),默认值为1000

源码:

alter table fruits add quantity int(5) default(1000);

运行测试结果截图:

创建触发器实现当客户下订单,fruits表对应此商品的数量自动的发生变化(减少或增加):

具体要求:

(1)在orderitems表中修改某个订单的商品数量后时, fruits表对应此商品的数量发生相应的改变。

(2)在orderitems表中增加一个购买详单(增加一个元组)时, fruits表对应此商品的数量发生相应的改变。

源码:

(1)

create trigger update_q after update on orderitems for each row

    update fruits set quantity=quantity+old.quantity-new.quantity where f_id=new.f_id;

update orderitems set quantity=30 where f_id='a1';

(2)

create trigger insert_q after insert on orderitems for each row

update fruits set quantity=quantity-new.quantity where f_id=new.f_id;

insert into orderitems values(30002,2,'b3',60,6.70);

运行测试结果截图:

(1)修改前:

 

修改后:

 

(2)

修改前:

 

修改后:

 

3.用Mysql8审计功能实现保存非root用户的更新操作( binlog + init-connect ):

  1. 创建审计数据库auditdb及表accesslog;

源码:

create database auditdb;

use auditdb;

create table accesslog(

          ID int(11) not null auto_increment,

          ServerID int(11) default null,

          ConnectionID int(11) default null,

          ConnUser varchar(30) default null,

          MatchUser varchar(30) default null,

          LoginTime datetime default null,

          primary key(ID)

)ENGINE=InnoDB auto_increment=1 default charset=utf8mb4;

 

 

  1. 为普通用户赋予写入表'accesslog'权限(每个非Root用户都要先授权,否则无法与数据库建立连接);

源码:

grant insert on `auditdb`.`accesslog` to `B001`@`%`;

flush privileges;

  1. 配置init-connect,用于当普通用户对目标数据库进行操作时自动写入审记表中,在my.ini(Linux系统下是my.cnf)中配置;

源码:

set global init_connect='insert auditdb.accesslog(ServerID,ConnectionID,ConnUser,MatchUser,LoginTime) values(@@server_id,connection_id(),user(),current_user(),now());';

  1. 开启mysql-binlog日志记录,在my.ini中配置:

           # 二进制日志 
log-bin=mysql-bin 
# binlog-do-db=db #
仅作用的库 
expire_logs_days = 20 
max_binlog_size = 300m 

  1. 重启mysql

源码:

net stop mysql

net start mysql

测试效果截图:

      

三、小结

1.遇到的问题及解决过程

问题:开始没理解触发器最后一题的题意,增加一个购买详单时没有选择插入一整个元组,而是单纯改变了一个数值,导致结果跟上一小题的做法没有区别。

解决过程:重新理解了题意,改为在表中添加元组。

2.产生的错误及原因分析

错误:插入数据时失败

    原因分析:忘了o_num为orders主键,必然唯一。

3.体会和收获。

本次博客通过对数据库进行一些列操作,学习和了解了触发器的工作原理、定义及操作方法。同时在实验中通过解决出现的问题与错误,在解决问题的过程中学到了更多的Mysql数据库相关的其他内容。通过后台的操控了解了更多可视化数据库管理系统的功能多样与数据库的用处之广,总的来说收获满满。

附:

1.解密mysql-bin查看内容(日志文件)

注意进入日志文件路径后再操作

C:\ProgramData\MySQL\MySQL Server 8.0\Data>mysqlbinlog  --base64-output=decode-row -vv  mysql-bin.000002  > ./mysql-bin.000002--vv.log

2.查看日志文件内容

C:\ProgramData\MySQL\MySQL Server 8.0\Data>more mysql-bin.000002--vv.log

3.根据thread_id号去找init-connect记录表的登录用户和源ip

mysql -u root -p123456 -e "select * from auditdb.accesslog  where connectionID=8 ;"

4.下载并安装MySQL Binlog Digger可视化分析日志

模拟插入或删除表中的一行,再用MySQL Binlog Digger显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278124.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数图形渐近线分析

文章目录 曲线的渐近线水平和垂直渐近线斜渐近线斜渐近线公式推导简便方法确定斜渐近线(一次多项式化方法) 例 曲线的渐近线 渐近线综合了极限和函数图形的知识,尤其是斜渐近线 水平和垂直渐近线 若点 M M M沿曲线 y f ( x ) yf(x) yf(x)无限远离原点时,它于某条直线 L L L之…

npm详解

NPM(Node Package Manager)是Node.js的包管理工具,用于管理和共享被发布到模块仓库的JavaScript代码. NPM的定义 NPM是Node.js的默认包管理工具,它的功能包括安装、管理、卸载和发布开源模块。NPM提供了一个模块仓库,开…

用什么样的开源流程表单实现办公流程化?

近日,有不少热心网友询问道:如果要实现流程化办公,让整个办公效率火速提升上来,可以用什么样的开源流程表单工具?大伙都知道,随着低代码开发平台的盛行,办公效率也得到很大的提升,它…

RS®SMM100A 矢量信号发生器具备毫米波测试功能的中档矢量信号发生器

R&SSMM100A 矢量信号发生器 具备毫米波测试功能的中档矢量信号发生器 R&SSMM100A 矢量信号发生器在 100 kHz 至 44 GHz 的频率范围内提供优越的射频特性。这款仪器覆盖现有无线标准所使用的 6 GHz 以下的频段、新定义的最高 7.125 GHz 的 5G NR FR1 和 Wi-Fi 6E 频段以…

【算法与数据结构】53、LeetCode最大子数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:程序一共两个变量,一个result一个count。result用来记录最终的结果,count记录当…

Redis——02,redis-benchmark 性能测试

redis-benchmark 性能测试 一、benchmark 性能测试。二、参数详解: 一、benchmark 性能测试。 在bin目录下,有一个redis-benchmark 工具,是用来测试性能的。 二、参数详解: http://doc.yaojieyun.com/www.runoob.com/redis/re…

通义千问 Qwen-72B-Chat在PAI-DSW的微调推理实践

01 引言 通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛,包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上,使用对齐机制打造的…

hive的分区表和分桶表详解

分区表 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 静态分区表基本语法 创建分区表 create table dept_p…

Date/Timestamp类型前端传空请求400

Timestamp类型字段前端传参空的 就请求400 集中解决方式: 1、直接页面干掉这几个字段不传 2、后端修改类型为String 3、前端请求前判断如果是空的就去掉 这边采用第三种解决的,在提交前去掉就行 // 移除空值字段 $(.showdiv input).each(function()…

1130 - Host “WIN-CA4FHERGO9J‘ is not allowed to connect to this MySQL server

1、知识小课堂 1.1 Mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品。它是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS (Relational Database Management System&am…

Flink+Kafka消费

引入jar <dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.8.0</version> </dependency> <dependency><groupId>org.apache.flink</groupId><artifactI…

迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区域&#xff08;Region of Interest, ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3…