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

news2024/10/2 10:33:58

一、实验目的与要求:

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.coloradmin.cn/o/2166116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 应用层自定义协议与序列化

文章目录 一、应用层1、协议2、序列化 && 反序列化3、通过Json库进行数据的序列化 && 反序列化Json::Value类Json::Reader类Json::Writer类 二、为什么read、write、recv、send和Tcp支持全双工?发数据的本质:tcp支持全双工通信的原因&am…

gitlab-runner集成CI/CD完整项目部署

目录 1.环境安装 2.gitlab代码仓库搭建 3.gitlab-runner-安装以及注册 4..gitlab-ci.yml脚本 5.脚本说明 6.build.sh 7.test.sh 8. deploy.sh 9.运行流水线 10.选择流水线分支 11.查看运行阶段 12.查看运行日志 13.查看服务器真实日志 1.环境安装 确保服务器的Java环…

Python_异常机制

软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是:Exception,意思是例外。遇到这些例外情况,或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出&…

Footprint Growthly Quest 工具:赋能 Telegram 社区实现 Web3 飞速增长

作者:Stella L (stellafootprint.network) 在 Web3 的快节奏世界里,社区互动是关键。而众多 Web3 社区之所以能够蓬勃发展,很大程度上得益于 Telegram 平台。正因如此,Footprint Analytics 精心打造了 Growthly —— 一款专为 Tel…

Tkinter制作登录界面以及登陆后页面切换

Tkinter制作登录界面以及登陆后页面切换 前言序言1. 由来2. 思路3. 项目结构描述4. 项目实战1. 登录界面实现(代码)2. 首页界面实现(代码)3. 打包build.py(与main.py同级目录)4. 打包安装包 前言 本帖子&a…

【nrm】npm 注册表管理器

nrm是什么 nrm(NPM Registry Manager)是一个用于管理 Node.js 包管理器(如 npm 和 Yarn)的注册表工具。它可以帮助用户快速切换不同的 npm 源,以便于提高包安装的速度和效率,特别是在中国大陆地区&#xf…

Ubuntu23.10下处理libncurses5-dev包的安装问题

Ubuntu23.10下处理libncurses5-dev包的安装问题 导语环境准备问题和解决方案总结参考文献 导语 使用Ubuntu23.10的时候,遇到需要termios的场景,结果发现无论是codeblocks还是系统本身的gcc都无法找到term.h和curse.h,网上找了很多解决方案都…

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求,而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端,保护他们的云工作负载(指所有部署的应用程序和服务)变得越来越重要。云工作负载保护&…

【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机

TIM定时器输出比较 一、输出比较简介1、OC(Output Compare)输出比较2、PWM简介3、输出比较通道(高级)4、输出比较通道(通用)5、输出比较模式6、PWM基本结构配置步骤:程序代码:PWM驱动LED呼吸灯 7、参数计算8、舵机简介程序代码&am…

nginx 安装(Centos)

nginx 安装-适用于 Centos 7.x [rootiZhp35weqb4z7gvuh357fbZ ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.9.2009 (Core) Release: 7.9.2009 Codename: Core# 创建文件…

大模型训练:K8s 环境中数千节点存储最佳实践

今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的 KubeCon 中国大会上进行了该主题分享。 Kubernetes 已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢。与此同时,人工智能技术的迅速发展,尤其是大型语言模型&…

智慧政务助力实现服务民生新突破

在数字化转型的浪潮中,中国移动紧密结合人工智能(AI)技术,推动政务服务的智能化升级。近日,中国移动正式发布政务大模型3.0版本,以科技创新提升政务效率,实现服务民生的新突破。 为什么…

【Android】页面启动耗时统计流程梳理

文章基于Android 11 写在前面: 最近的文章都会放流程图,时序图之类的图片,解释下为什么这么做: 图片的好处: 流程清晰,一目了然很多代码,如同老太太的裹脚布,又臭又长。影响理解&a…

Python的Pandas库学习指南

应用场景 Pandas库因其强大的数据处理和分析能力,在数据科学和数据分析领域有着广泛的应用。 1. 数据清洗 处理缺失数据:通过删除或填充缺失值来清洗数据。数据类型转换:将数据转换为合适的格式,例如将日期字符串转换为日期类型…

k8s_资源管理介绍

资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…

AI-Talk开发板之wifi scan

一、说明 AI-Talk开发板使用ESP32-C3扩展WIFI通信功能,与CSK6011A通过SPI接口通信。 与处理器的信号连接: ESP32-C3需要烧录hosted固件,参考:AI-Talk开发板更新ESP32固件_esp32 固件-CSDN博客 二、工程 1、创建项目 进入exampl…

本地编译安装|编译安装最新版postgis3.4.3版本指南

一、本地编译安装步骤介绍 本地编译,指的是在本地环境编译安装某个软件,例如,本文所述的最新版postgis3.4.3,本地是什么cpu架构,编译完成后,编译产出物就可以在其它的同cpu架构的服务器上直接适用了&#…

关于JAVA中Scanner和sout读取超时问题

1.Scanner与System.out为什么慢 Scanner读取速度慢的原因: 在ACM模式下,输入数据和输出数据时,他会将数据放在一个文件里面 在new上一个Scanner时,去调用一个next()方法,他会去访问IO设备&…

【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh

介绍 iTerm2 iTerm2是默认终端的替代品,也是目前Mac系统下最好用的终端工具,集颜值和效率于一身。 Oh-My-Zsh Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。 它基于Zsh 命令行&#xff0c…

docker-文件复制(docker ps:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…