[数据库实验五] 审计及触发器

一、实验目的与要求:

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 opertaion(  

    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)

)

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

源码:

CREATE TRIGGER insert_f AFTER INSERT ON fruits FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('fruits','insert',NOW(),CURRENT_USER());

CREATE TRIGGER update_f AFTER UPDATE ON fruits FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('fruits','update',NOW(),CURRENT_USER());

CREATE TRIGGER delete_f AFTER DELETE ON fruits FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('fruits','delete',NOW(),CURRENT_USER());

CREATE TRIGGER insert_oi AFTER INSERT ON orderitems FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('orderitems','insert',NOW(),CURRENT_USER());

CREATE TRIGGER update_oi AFTER UPDATE ON orderitems FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('orderitems','update',NOW(),CURRENT_USER());

CREATE TRIGGER delete_oi AFTER DELETE ON orderitems FOR EACH ROW

INSERT INTO opertaion(tablename,opname,optime,`ConnUser`)VALUES('orderitems','delete',NOW(),CURRENT_USER());

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

运行测试结果截图:登录B001账号,插入数据后,opertaion表格实现自动添加更新记录,结果如下图所示:

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 =50 WHERE f_id='a1';
  1. 增加一个购买详单:
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(50001,4,'x0',200,8.80);

运行测试结果截图:

修改前的fruits表格和orderitems表格

修改后的fruits表格和orderitems表格

三、实验小

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

问题:在orderitems表中修改某个订单的商品数量后时, fruits表对应此商品的数量发生相应的改变,不能对新旧数据进行判断后正确执行

解决过程:触发器经过判断,新旧字段值不一样,因此调用UPDATE fruits SET quantity=quantity+old.quantity-new.quantity where f_id=new.f_id;

实现对于数据的修改。

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

错误:在通过B001账号登录,在fruits表中插入一条水果信息,查看opertaion表是自动添加更新记录的ConnUser为root@localhost而不是B001。

原因分析:在MySQL中,CURRENT_USER()函数返回的是当前连接的用户名,而不是执行SQL语句的用户。在创建触发器时,此时的CURRENT_USER()返回的是root@localhost,因为执行这个触发器的账号是root。如果想让ConnUser字段显示插入记录的用户,需要在应用程序中获取并传递这个信息。例如,可以在插入数据时,将用户信息作为参数传递给存储过程或函数,然后在存储过程中使用这个参数来插入数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

linux----进程地址空间

前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、空间分布 二、栈和堆的特点 (1)栈堆相对而生,堆是向上增长的,栈是向下增长的。 验证:堆是向上增长的 这里我们看到申请的堆&#xff…

记一次Windows状态栏不显示问题

文章目录 🪟解决方案☁️单次处理☁️有效处理 🪟现象🪟尝试的操作⭐END🌟跋🌟交流方式 🪟解决方案 ☁️单次处理 重启explorer.exe 命令行操作 注意,使用命令行操作的时候,出现…

链动 2+1 模式 S2B2C 商城小程序源码:创新价格盈利模式探索

摘要:本文深入探讨了价格盈利模式的两种类型,即价格返利模式和动态定价盈利模式。通过引入链动 21 模式 S2B2C 商城小程序源码,分析其在实现这两种价格盈利模式方面的优势和应用场景,为朋友圈卖货及电商领域的发展提供新的思路和方…

QT菜单之快捷菜单设计

快捷菜单又称为上下文菜单,通常在用鼠标右击的时候弹出。创建快捷菜单的方法和创建菜单栏菜单类似。 效果图: 一、将MainWindow类对象的ContextMenuPolicy属性设置为customContextMenu。 打开mainWindow.ui,在属性视图上找到ContextMenuPoli…

一文掌握python单元测试unittest(二)

接上篇:https://blog.csdn.net/qq_38120851/article/details/141642215 目录 四、参数化测试 1、使用 subTest 2、使用装饰器 3)使用第三方库parameterized 五、跳过测试 1、使用 unittest.skip() 或 unittest.skipIf() 装饰器: 2、使用 setUp() 方法中的断言来跳过整…

EasyCVR智慧公园视频智能管理方案:赋能公园安全管理新高度

随着城市化进程的加速,智慧城市建设已成为提升城市管理效率、增强居民生活质量的重要途径。智慧公园作为智慧城市的重要组成部分,其安全与管理水平直接影响着市民的休闲娱乐体验。EasyCVR智慧公园视频智能管理方案,正是基于这一背景应运而生&…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务,车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说,如何将自己的应用程序无缝集成到车载系统中,利用汽车的硬件和服务能力,是一个极具挑战性…

【Docker】01-Docker常见指令

1. Docker Docker会下载镜像,运行的时候,创建一个隔离的环境,称为容器。 docker run -d \ # 创建并运行一个容器,-d表示后台运行 --name mysql \ # 容器名称-p 3307:3306 \ # 端口映射,宿主机端口映射到容器端口-e TZ…

Cilium + ebpf 系列文章-什么是ebpf?(一)

前言: 这篇非常非常干,很有可能读不懂。 这里非常非常推荐,建议使用Cilium官网的lab来辅助学习!!!Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…

linux命令:显示已安装在linux内核的模块的详细信息的工具modinfo详解

目录 一、概述 二、使用方法 1、基本的使用语法 2、常用选项 3、输出字段 4、获取帮助 三、示例 四、实际用途 1、诊断问题 2、模块依赖 3、参数配置 五、其他事项 一、概述 modinfo 是 Linux 系统中的一个工具,用于显示有关已安装内核模块的详细信息。…

中间件:maxwell、canal

文章目录 1、底层原理:基于mysql的bin log日志实现的:把自己伪装成slave2、bin log 日志有三种模式:2.1、statement模式:2.2、row模式:2.3、mixed模式: 3、maxwell只支持 row 模式:4、maxwell介…

MySQL多版本并发控制MVCC实现原理

MVCC MVCC 是多版本并发控制方法,用来解决读和写之间的冲突,比如脏读、不可重复读问题,MVCC主要针对读操作做限制,保证每次读取到的数据都是本次读取之前的已经提交事务所修改的。 概述 当一个事务要对数据库中的数据进行selec…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…

828华为云征文|使用Flexus X实例安装宝塔面板教学

目录 一、Flexus X实例简介 1.1 概述 1.2 产品规格 二、切换操作系统 2.1 Huawei Cloud EulerOS 2.0 标准版 2.2 切换镜像 三、部署宝塔面板 3.1 安装宝塔面板 3.2 放通安全组规则 3.3 登录宝塔面板 四、使用感受 4.1 柔性算力随心配 4.2 一直加速一直快 4.3 越用…

【小程序】微信小程序课程 -2 快速上手

目录 1、快速上手基本概念 1.1 小程序常用组件 1.2 tabbar配置 1.3 尺寸单位 1.4 样式 1.4.1 全局样式 app.wxss 1.4.2 局部样式 xx.wxss 2、首页案例 2.1 button组件使用 2.2 swiper swiper-item 2.3 tips效果 2.4 引入矢量图 2.5 flex(布局&#…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数?什么是纯虚函数 虚函数:函数前加关键字virtual,就定义为虚函数,虚函数能够被子类中相同函数名的函数重写 纯虚函数:把虚函数的函数体去掉然后加0;就能定义出一个纯虚函数。 2、基…

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图,我这里是打包时候报错,就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包,成功。

刷题计划 day10 栈与队列上【用栈实现队列】【用队列实现栈】【有效的括号】【删除字符串中的所有相邻重复项】

⚡刷题计划day10栈与队列继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 ⚡刷题计划day10继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的…