MySQL存储过程及用户权限管理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

MySQL存储过程及函数:

创建存储过程:
delimiter //
create procedure 存储过程名称
--begin
--sql语句1
--语句2
.....
--end//
delimiter ;
其中:参数为: [IN|OUT|INOUT] parameter_name type
其中IN表示输入参数,
OUT表示输出参数,
INOUT表示既可以输入也可以输出;
param_name表示参数名称;type表示参数的类型

具体应用:创建无参数存储过程
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> create procedure dropdatabase()

-> begin
-> drop database testdb;
-> end//

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> delimiter ;

具体应用2:有参数存储过程
MariaDB [testdb]> create procedure text(in name varchar(20))

-> begin
-> insert into testdb.students set name=name;
-> end//

Query OK, 0 rows affected (0.00 sec)

MariaDB [testdb]> delimiter ;
MariaDB [testdb]> call text('jim');
Query OK, 1 row affected (0.01 sec)

MariaDB [testdb]> select * from testdb.students;
name
name
jim

2 rows in set (0.00 sec)

查看存储过程的定义:
show create procedure 存储过程名;

调用存储过程:call [存储过程名称];

查看存储过程列表:
show procedure status;

删除存储过程:
drop procedure [存储过程名称];

注意事项:
在哪个库中创建的存储过程就在哪个库中使用,如果
跨库调用需要使用[存储过程所在库].[存储过程名],
例如hellodb.test这种方式,删除时,同样要这样删除
MySQL触发器:

创建触发器:
创建触发器
CREATE [DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
说明:
trigger_name:触发器的名称
trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发
trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件
tbl_name:该触发器作用在表名

具体应用:
模拟场景:转账过程!
两张表分别记录jim和tom原有的钱
jim最开始有1万,tom有2千,现在模拟jim给tom转账1
千元.....
MariaDB [textdb]> create trigger text

-> after update
-> on user1 for each row
-> update user2 set money = money+1000;

Query OK, 0 rows affected (0.30 sec)

MariaDB [textdb]> update user1 set money = 9000;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [textdb]> select * from user1;
name money
jim 9000

1 row in set (0.00 sec)

MariaDB [textdb]> select * from user2;
name money
tom 3000

1 row in set (0.00 sec)

注意事项:
before:表示在这个事件之前触发,也就是说,如果
用户执行一个insert动作,在用户还没有执行insert之
前就会被触发器中设定的动作所替换!

查看触发器:
show triggers;
删除触发器:
drop trigger [触发器名称];
MySQL用户及权限管理:

1 创建用户:仅能创建一个受限制的用户,并支持赋予密码!
create user username@hostname identified by '密码'
具体用法:
MariaDB [textdb]> create user 'yl'@'172.20.%.%' identified by '密码';

2 修改用户名:对以登录的用户不起作用
rename user
用法格式:rename user [旧名称] to [新名称];
具体用法:
mysql> rename user yl@'172.20.%.%' to gw@'172.20.%.%';

3 修改用户密码:
使用格式:
set password for username = password('密码');
具体用法:
set password for root = password('密码');

4 删除用户:
DROP USER username@hostIP --删除用户
在线连接的时候也可以删除用户!
具体用法:
MariaDB [mysql]> drop user gw@'172.20.%.%';

忘记管理员密码后的解决办法:
启动mysqld进程时,为其使用如下选项:
--skip-grant-tables --skip-networking[不允许网络连接]
使用UPDATE命令修改管理员密码
关闭mysqld进程,移除上述两个选项,重启mysqld

编辑/etc/my.cnf
[mysqld]
skip-grant-tables

重启服务后登录mysql直接更改管理员密码即可!
MySQL权限分类:

库级别权限/表级别:
alter ----修改表
alter routing ---修改存储过程和函数
create ---是否可以创建表和库
create routing ---是否可以创建存储过程和函数
create view --是否可以创建视图
drop ---是否可以删除表和库
execute ---是否可以执行存储过程和函数
grant option ---是否可以把自己获取的权限转给他人
index ----是否可以创建和删除索引
show view --是否可以查看视图的创建过程

数据操作权限(表级别):
delete ---是否可以删除表中的行
insert ---是否可以插入数据
select ---是否可以查询数据
update ---是否可以修改数据

字段级别权限
select(字段1....)
ipdate(字段1....)
insert(字段1....)

管理类权限
create temporary tables ---创建临时表权限
create user ---能否创建用户
file ---在mysql服务器上读取和写入文件
lock tables ---可以手动显式施加表锁
process ---查看线程列表
具体命令:
show processlist
reload ----可以使用flush和resrt
主从复制:
replication client ---向服务器查询所有复制客户端
replication slave ---授权客户端有复制权限
show databases ---是否可以查看表
shutdown ---是否可以关闭服务器
super ----杂项命令

所有权限:all

权限的授予和收回:

grant [权限] on 修饰符,默认是表 to [用户]@[主机IP] identified by '密码',{多个用户之间逗号隔开} [require ssl];
object_type:修饰符

TABLE  ---默认是表

| FUNCTION ---存储函数
| PROCEDURE ---存储过程

priv_level:

*  ---所有库,表,函数,过程

| . ---所有库的所有对象
| db_name.* ---某一个库的所有对象
| db_name.tbl_name ---某一个库的一个表
| tbl_name ---某张表
| db_name.routine_name ---指定库的存储过程

with_option:

GRANT OPTION ----把自己的权限授权给它人

| MAX_QUERIES_PER_HOUR count ---每小时允许最大执行查询的次数
| MAX_UPDATES_PER_HOUR count ---每小时允许最大执行修改的次数
| MAX_CONNECTIONS_PER_HOUR count ---每小时允许最大建立连接的次数
| MAX_USER_CONNECTIONS count ---指定使用同一个账号,最多并发连接几次!

grant命令使用时,如果没有该用户,就会自动创建!

具体用法:
grant all on testdb.* to 'yl'@'172.20.%.%' identified by '密码';

回收权利:revoke
具体用法:
revoke insert on testdb.* from 'yl'@'172.20.%.%';
对正在登录的用户不起作用,用户退出再次登录后生效

收回全部权利:
revoke all on [某库或某表] from [用户@主机IP];

查看用户能够使用的权限:
show grants for username@'hostname';
具体用法:
MariaDB [testdb]> show grants for yl@'172.20.%.%';

查看当前用户权限:
show grants for current_user();

几个跟用户授权相关的表:
db:库级别权限
host:主机级别权限,已废弃
tables_priv:表级别权限
colomns_priv:列级别的权限
procs_priv:存储过程和存储函数相关的权限
proxies_priv:代理用户权限

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 SQL NoSQL
|
2月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
48 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
67 3
|
2月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
86 1
|
4月前
|
关系型数据库 MySQL 数据库
MySQL用户权限管理你知道多少?
MySQL用户权限管理你知道多少?
128 0
|
4月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
54 0
|
4月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
51 0
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
24 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2