MySQL深度探索:掌握触发器自动化与精细用户权限管理,提升数据库效能与安全

news2024/11/15 15:25:17

  •  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-CSDN博客

目录

前言:

触发器(Triggers):

用户权限(User Permissions):

一.触发器

1.MySQL触发器简介

2.引发触发器执行的事件,如下:

3.触发程序的优点,如下:

4.触发器的特性:

5.MySQL 所支持的触发器有三种:

6.触发器包含两个虚拟表:new表、old表:

二.创建触发器

创建触发器的语法如下:

可以说MySQL创建以下六种触发器:

案例1:before触发器

(1)创库

(2)创表

(3)创建求和触发器

(4)验证求和函数

案例2:alter触发器

案例3:delete触发器 ***

update 触发器

案例1

案例2

三.创建有多个执行语句的触发器

1.CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件

2.用户users表

3.日志logs表:

4.创建触发器:

5.插入数据,并查看日志表

6.查看触发器

7.删除触发器

8.限制和注意事项

触发器会有以下两种限制:

注意事项:

9.总结

数据库触发器有以下的作用(增强性):

(1)安全性。

(2)审计。

(3)实现复杂的数据完整性规则

(4)实现复杂的非标准的数据库相关完整性规则。

(5)同步实时地复制表中的数据。

(6)自动计算数据值。

四.用户和权限

1.select  user,host,grant_priv from mysql.user;

2.创建新用户

3.删除用户

4.修改用户密码

5.常用权限

6.撤权

7.查看权限


前言:

在当今数据驱动的时代,数据库管理系统(DBMS)作为企业信息架构的核心,扮演着至关重要的角色。MySQL,作为最流行的开源关系型数据库管理系统之一,凭借其高性能、可靠性、灵活性和成本效益,在各行各业中得到了广泛应用。无论是初创企业还是大型企业,MySQL都是管理数据、支持业务决策和驱动应用程序运行的首选之一。

在MySQL的强大功能中,触发器和用户权限是两个不可或缺的特性,它们在保障数据一致性、自动化数据操作以及确保数据库安全方面发挥着至关重要的作用。

触发器(Triggers):

触发器是MySQL中一种特殊类型的存储过程,它会在指定的数据库表上执行INSERT、UPDATE或DELETE等操作时自动执行。通过巧妙地使用触发器,数据库管理员和开发者可以实现复杂的业务规则自动化,确保数据的完整性和一致性。例如,当向某个表中插入新记录时,触发器可以自动更新另一个表中的相关统计信息,或者根据特定条件阻止不合规的数据被插入。触发器简化了数据操作逻辑,提高了开发效率,同时也减少了因人为错误导致的数据问题。

用户权限(User Permissions):

在数据库管理中,确保数据安全是至关重要的。MySQL通过精细的权限控制机制,允许数据库管理员为不同用户分配不同的操作权限,从而有效防止未授权访问和数据泄露。理解并正确配置用户权限,对于维护数据库的安全性和完整性至关重要。从简单的读取权限到复杂的数据修改和表结构管理权限,MySQL提供了丰富的权限选项,以满足不同场景下的安全需求。

本文旨在深入探讨MySQL数据库中的触发器和用户权限两大核心特性,通过理论讲解与实例分析相结合的方式,帮助读者理解这些概念的基本原理、应用场景以及最佳实践。无论是数据库初学者还是经验丰富的数据库管理员,相信都能从本文中获益匪浅,进一步提升在MySQL数据库管理方面的能力和水平。


正文:

一.触发器

1.MySQL触发器简介

MySQL 数据库中触发器是一个特殊的存储过程;  

存储过程要使用 CALL 语句来调用,而触发器的执行是事件(insert、update、delete)自动触发。

2.引发触发器执行的事件,如下:

增加一条学生记录时,会自动检查年龄是否符合范围要求。

每当删除一条学生信息时,自动删除其成绩表上的对应记录。

每当删除一条数据时,在数据库存档表中保留一个备份

3.触发程序的优点,如下:

触发程序的执行是自动的,当对触发程序相关表的数据做出相应的修改后立即执行。

触发程序可以通过数据库中相关的表层叠修改另外的表。

触发程序可以实施比 FOREIGN KEY 约束、CHECK 约束更为复杂的检查和操作。

4.触发器的特性:

有begin end体,begin end;之间的语句可以写的简单或者复杂

什么条件会触发:Insert、Update、Delete

什么时候触发:在增删改前或者后

触发频率:针对每一行执行

触发器定义在表上,附着在表上

5.MySQL 所支持的触发器有三种:

INSERT 触发器、UPDATE 触发器和 DELETE 触发器

6.触发器包含两个虚拟表:new表、old表:

insert触发器引用new表来存储被插入的行;

update触发器引用new表存储更新后的值,引用old表存储更新前的值;

delete触发器引用old表存储删除前的值。


二.创建触发器

创建触发器的语法如下:

create trigger trigger_name trigger_time trigger_event ON tb_name for each row trigger_stmt

trigger_name:触发器的名称

tirgger_time:触发时机,为BEFORE或者AFTER

trigger_event:触发事件,为INSERT、DELETE或者UPDATE

tb_name:表示建立触发器的表名,就是在哪张表上建立触发器

for each row: 表示任何一条记录上的操作满足触发事件都会触发该触发器

trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句

可以说MySQL创建以下六种触发器:

BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE

AFTER INSERT,AFTER DELETE,AFTER UPDATE

案例1:before触发器

(1)创库

create database benet;

use benet;

(2)创表

create table tb_emp8

(id int not null primary key,

name varchar(22) not null,

deptid int not null,

salary float not null);

(3)创建求和触发器

create trigger sumofsalary

before insert on tb_emp8

for each row

set @sum=@sum+NEW.salary;

(4)验证求和函数

set @sum=0;

insert into tb_emp8 values (1,'A',1,1000),(2,'B',2,500);
select * from tb_emp8;

 

select @sum;

案例2:alter触发器

use benet;

create table tb_emp6 like tb_emp8;

create table tb_emp7 like tb_emp8;



create trigger doubleofsalary

after insert on tb_emp6

for each row

insert into tb_emp7

values (

NEW.id,NEW.name,NEW.deptId,2*NEW.salary);



INSERT INTO tb_emp6 VALUES (1,'A',1,1000),(2,'B',1,500);
SELECT * FROM tb_emp6;

 

SELECT * FROM tb_emp7;

案例3:delete触发器 ***

delimiter //

create trigger deny_del before delete

on tb_emp7 for each row

begin

rollback;

end //

报错,显式语句start transaction,commit,rollback在触发器语句中不识别。

create procedure rollbk() begin rollback; end//



create trigger deny_del before delete

on tb_emp7 for each row

begin

call rollbk;

end //



delimiter ;



delete from tb_emp7 where id=1;

update 触发器

案例1

create table test(

id int primary key,

flg nvarchar(20)

);

insert into test values(1,'');

insert into test values(2,'');



delimiter //

CREATE TRIGGER trig_test_update

before  update  on  test for each row

BEGIN

  set new.flg='有更新';

END;

//

delimiter ;



update test set id='3' where id=2;



select * from test;

案例2

项目需求: 提现表,支付宝信息被修改,怎么限制, 插入的数据针对字段不被修改

create table user_withdraw

(id int primary key,name varchar(20),alipay_num int,money int,real_money int);



insert into user_withdraw values

(1,'zhangsan','10001','100000','200000'),

(2,'lisi',10002,300000,400000);



delimiter //

CREATE TRIGGER user_withdraw_update  BEFORE UPDATE ON user_withdraw

       FOR EACH ROW

       BEGIN

           IF OLD.alipay_num is not null THEN

               SET NEW.alipay_num = OLD.alipay_num,NEW.money= OLD.money,NEW.real_money=OLD.real_money;

           END IF;

       END;//

delimiter ;



update user_withdraw set money='30000' where id=2;

select * from user_withdraw;


三.创建有多个执行语句的触发器

1.CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

    执行语句列表

END

DELIMITER //

CREATE TRIGGER demo BEFORE DELETE

ON users FOR EACH ROW

BEGIN

INSERT INTO logs VALUES(NOW());

INSERT INTO logs VALUES(NOW());

END //

DELIMITER ;

load data语句是将文件的内容插入到表中,相当于是insert语句,而replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时候执行一条replace语句相当于执行了一条delete和insert语句。

2.用户users表

CREATE TABLE users (   

id int  NOT NULL AUTO_INCREMENT primary key,

name varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,

add_time varchar(20) DEFAULT NULL )  

AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8mb4;

3.日志logs表:

CREATE TABLE `logs` (

  `Id` int(11) NOT NULL AUTO_INCREMENT,

  `log` varchar(255) DEFAULT NULL COMMENT '日志说明',

  PRIMARY KEY (`Id`)

)  DEFAULT CHARSET=utf8mb4 COMMENT='日志表';

4.创建触发器:

当在users中插入一条数据,就会在logs中生成一条日志信息。

DELIMITER $

CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW

BEGIN

declare s1 VARCHAR(40)character set utf8mb4;

declare s2 VARCHAR(20) character set utf8mb4;

SET s2 = " is created";

SET s1 = CONCAT(NEW.name,s2);     

INSERT INTO logs(log) values(s1);

END $

DELIMITER ;

5.插入数据,并查看日志表

insert into users(name,add_time) values('zhangsan',now());

6.查看触发器

SHOW TRIGGERS;

SELECT * FROM information_schema.triggers;

7.删除触发器

drop trigger user_log;

8.限制和注意事项

触发器会有以下两种限制:

(1)触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。

(2)不能在触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。

注意事项:

MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果是对非事务表进行操作,那么就无法回滚了,数据可能会出错。

9.总结

触发器是基于行触发的,所以删除、新增或者修改操作可能都会激活触发器,所以不要编写过于复杂的触发器,也不要增加过多的触发器,这样会对数据的插入、修改或者删除带来比较严重的影响,同时也会带来可移植性差的后果,所以在设计触发器的时候一定要有所考虑。

触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。

数据库触发器有以下的作用(增强性):

(1)安全性。

可以基于数据库的值使用户具有操作数据库的某种权利。

  # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

  # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。

(2)审计。

可以跟踪用户对数据库的操作。   

  # 审计用户操作数据库的语句。

  # 把用户对数据库的更新写入审计表。

(3)实现复杂的数据完整性规则

  # 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。

 # 提供可变的缺省值。

(4)实现复杂的非标准的数据库相关完整性规则。

触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。

  # 在修改或删除时级联修改或删除其它表中的与之匹配的行。

  # 在修改或删除时把其它表中的与之匹配的行设成NULL值。

  # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。

  # 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。

(5)同步实时地复制表中的数据。

(6)自动计算数据值。

如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据


四.用户和权限

1.select  user,host,grant_priv from mysql.user;

mysql.user表:特殊列属性

max_questions:   用户每小时允许执行的查询操作次数

          max_updates: 用户每小时允许执行的更新操作次数

      max_connections: 服务器每小时最大允许执行的连接操作次数

 max_user_connections: 单用户允许同时建立的连接次数

mysql.db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数据库。

select user,host,db from mysql.db;

2.创建新用户

CREATE USER 'tom'@'%' IDENTIFIED BY 'mypass'; #仅创用户

GRANT SELECT,insert,UPDATE ON world.* TO 'tom'@'%' IDENTIFIED BY '123.com';  #创用户并赋权,mysql 8.0不允许

FLUSH privileges; #刷新权限列表

3.删除用户

DROP USER tom@'%';

或

DELETE FROM mysql.user WHERE host='%' and user='tom';

4.修改用户密码

mysqladmin -u root -p password "rootpassword"



GRANT USAGE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY '123.com';



update mysql.user set password=password("rootpwd") where user="root" and host="localhost";



SET PASSWORD=PASSWORD("123.com");  #默认修改root账户密码

  

SET PASSWORD FOR 'testUser'@'localhost'=PASSWORD("newped");  #修改普通用户密码

5.常用权限

6.撤权

REVOKE INSERT ON *.* FROM 'tom'@'%';

7.查看权限

SHOW GRANTS FOR 'tom'@'%'\G

期待您的关注~

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

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

相关文章

gitlab集成CI/CD,shell方式部署

目录 1.首先安装好gitlab和gitlab-runner,这两个,看我以往的教程 2.注册新的 Runner 3. 步骤 3.1 Enter the GitLab instance URL (for example, https://gitlab.com/): 3.2 Enter the registration token: 3.3 Enter a description for the runner: 3…

【2024.09】关于 UMLS 在支持大型语言模型提出的诊断生成中的作用

生物医学信息学杂志 链接:https://www.sciencedirect.com/science/article/abs/pii/S1532046424001254?via%3Dihub On the role of the UMLS in supporting diagnosis generation proposed by Large Language Models Author links open overlay panelMajid Afsh…

线上搭子小程序:随时随地找搭子!

搭子作为当下流行的一种社交方式,受到了年轻人的讨论关注,不管做什么都可以找不同的“搭子”。追剧、考试、健身、减肥、旅游等都可以找到志趣相投的搭子,满足年轻人的社交需求。 在互联网的发展下,年轻人找搭子也逐渐倾向于线上…

ubuntu22 解决docker无法下载镜像问题

参考在 Ubuntu 中安装 Docker_ubuntu安装docker-CSDN博客 安装docker完成后,运行如下命令验证 Docker 服务是否在运行: systemctl status docker 运行(sudo docker run hello-world)例子报错: 问题:Docker…

ubuntu内网穿透后在公网使用ssh登录

需求: 我有一台内网可以通过ssh 22端口访问的设备操作系统是ubuntu server我还有1台拥有公网IP的服务器,IP地址是 6.66.666.6666我想随时从其他网段通过ssh访问我的ubuntu server设备 实现: 工具准备:frp 网址:https…

一看就会!PS2024下载安装教程详解

PS2024下载方法: PS2024安装教程: 1、右击【PS2024.zip】,选择【解压到PS2024】 2、右击【Set-up.exe】,选择【以管理员身份运行】 3、点击右下角灰色的小文件夹图标,选择【更改位置】 4、选择安装路径后,…

【每日刷题】Day130

【每日刷题】Day130 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 144. 二叉树的前序遍历 - 力扣(LeetCode) 2. 94. 二叉树的中序遍历 - 力扣…

注册安全分析报告:闪送

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

C#测试调用Ghostscript.NET浏览PDF文件

Ghostscript.NET是针对Ghostscript的C#封装库,支持解析PostScript语言、操作PDF文件等。使用Ghostscript.NET的GhostscriptViewer 模块可以以图片形式查看PDF文档。本文学习并测试调用Ghostscript.NET模块打开及浏览PDF文件的基本用法。   Ghostscript.NET目前主要…

.NET 6.0 WebAPI 使用JWT生成Token的验证授权

1.引入相关程序包JwtBearer注意版本: 2.配置文件appsettings.json写相关配置参数(也可不写,写在程序里面,数据库读取也是一样的) , //JWT加密"JWTToken": {"SecretKey": "jsaduwqe6asdjewejdue7dfmsdfu0sdfmwmsd8wfsd6",…

洛谷-P3916 图的遍历

题目描述 给出 N 个点,M 条边的有向图,对于每个点 v,求A(v) 表示从点 v 出发,能到达编号最大的点。 思路 既然是要找到最大的点,那么我从最大的点开始DFS是否可以? 于是可以反向建图,然后从最…

HTML图片标记(四)配图详解

目录 1.HTML图片的基础语法 2.设置图片大小 3.改变图片边距 4.图片对齐方式 1.HTML图片的基础语法 <img src"图片路径"> 2.设置图片大小 <img src"图片路径" width"" length""> 3.改变图片边距 <img src"…

Python 二次开发金橙子打印软件:开启高效打印新旅程

目录 一、准备工作&#xff1a;搭建系统环境 二、二次开发流程详解 结合一个实例来讲解如何进行二次开发。 三、Python 二次开发关键要素 &#xff08;一&#xff09;源码示例与解读 &#xff08;二&#xff09;二次开发文档指引 四、问题汇总与解决方案 &#xff08;一…

【HTML5】html5开篇基础(2)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

Spring Boot 学习之路 -- 配置项目

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精通&…

【一起学NLP】Chapter2-学习神经网络

目录 学习神经网络损失函数Tip:One-hot向量导数与梯度Tip:严格地说链式法则计算图反向传播其他典型的运算结点乘法结点分支节点Repeat节点Sum节点MatMul节点 Tip:浅拷贝和深拷贝的差异梯度的推导和反向传播的实现Sigmoid层Affine层Softmax with Loss层 权重的更新——随机梯度下…

[PICO VR]Unity如何往PICO VR眼镜里写持久化数据txt/json文本

前言 最近在用PICO VR做用户实验&#xff0c;需要将用户实验的数据记录到PICO头盔的存储空间里&#xff0c;记录一下整个过程 流程 1.开启写入权限 首先开启写入权限&#xff1a;Unity->Edit->Player->安卓小机器人->Other Settings->Configuration->Wri…

大数据毕业设计选题推荐-网络电视剧收视率分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

数据库主备副本物理复制和逻辑复制对比

数据库主从节点的数据一致性是保证数据库高可用的基本要求&#xff0c;各个数据库在实现方式上也各有异同。而主备复制的方式无外乎两种&#xff1a;物理复制和逻辑复制&#xff0c;本文简要对比下两种方式的不同&#xff0c;并分析下国产数据库是如何实现的。 1、数据库复制基…

中国中车在线测评考的啥?大易题库如何通过|附真题型国企题库通关秘籍和攻略

言语理解题目&#xff1a;这类题目主要考察你的语言理解和表达能力&#xff0c;例如&#xff0c;给你一个段落&#xff0c;让你根据段落内容选择最合适的答案。要点是快速捕捉文段中的关键信息&#xff0c;理解作者的意图和观点 逻辑推理题目&#xff1a;这类题目需要你从一组…