设置相同的用户名,不同的访问地址(主机名),这样我们可以在不同的主机(网络地址)上登录账户连接数据。根据本文 1 MySQL 权限管理概念中的连接权限验证,只有当访问地址、用名名、密码验证通过后才能登录账户连接数据库。
# 创建本地登录的用户 test1,密码为 123456
create user 'test1'@'localhost' identified by '123456';
# 创建任何主机都可以连接的用户 test2,密码为 123456
create user 'test2'@'%' identified by '123456';
# 创建访问地址为'127.0.0.2' 的用户 test3,密码为 123456
create user 'test3'@'127.0.0.2' identified by '123456';
# 查看账号、访问地址、密码
select user, host, authentication_string from mysql.user;
在本地登录 test3 ,结果是:拒绝连接,因为没有 'test'@'localhost'
2.2 查看当前登录用户
# 查看当前登录的用户
select user();
select current_user();
2.3 修改用户名
rename 除了用来更改用户名外,还可以更改访问地址
# 更改用户名和访问地址
rename user 'test1'@'localhost' to 'test'@'%';
#查看用户名和访问地址
select user, host from mysql.user;
2.4 删除用户
# 删除用名为 test2、访问地址为 '%' 的用户
drop user 'test2'@'%';
3 授予权限
授权格式
grant [权限1,权限2,权限3] on [数据库].[表名] to [用户名]@[访问地址]
3.1 授予用户管理员权限
# 授予 'test1'@'localhost' 管理员权限
grant all privileges on *.* to 'test1'@'localhost' with grant option;
all privileges:表示将所有权限授予给用户。也可指定具体的权限,如SELECT、CREATE、DROP 等。
on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写 “*” 表示当前数据库的所有表,“*.*” 表示所有数据库的所有表。如果要指定将权限应用到 test1 库的 user 表中,可以这么写:test1.user
to:将权限授予哪个用户
with grant option:允许被授权的用户把得到的权限继续授给其它用户
3.2 授予用户数据库权限
权限
说明
select
表示授予用户可以使用 select 语句访问特定数据库中所有表和视图的权限
insert
表示授予用户可以使用 insert 语句向特定数据库中所有表添加数据行的权限
delete
表示授予用户可以使用 delete 语句删除特定数据库中所有表的数据行的权限
update
表示授予用户可以使用 update 语句更新特定数据库中所有数据表的值的权限
references
表示授予用户可以创建指向特定的数据库中的表外键的权限
create
表示授权用户可以使用 create table 语句在特定数据库中创建新表的权限
alter
表示授予用户可以使用 alter table 语句修改特定数据库中所有数据表的权限
show view
表示授予用户可以查看特定数据库中已有视图的视图定义的权限
create routine
表示授予用户可以为特定的数据库创建存储过程和存储函数的权限
alter routine
表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限
execute routine
表示授予用户可以调用特定数据库的存储过程和存储函数的权限
index
表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限
drop
表示授予用户可以删除特定数据库中所有表和视图的权限
create temporary tables
表示授予用户可以在特定数据库中创建临时表的权限
create view
表示授予用户可以在特定数据库中创建新的视图的权限
lock tables
表示授予用户可以锁定特定数据库的已有数据表的权限
all 或 all privileges
表示以上所有权限
# 创建用户 test
create user 'test'@'localhost' identified by '123456';
# 授予用户 test 在 study 数据库中查询、创建、修改、删除表的权限以及创建视图的权限
grant select, create, alter, drop, create view on study.* to 'test'@'localhost';
# 查询用户 test 权限
show grants for 'test'@'localhost';
3.3 授予用户表权限
# 创建用户 learn1
create user 'learn1'@'localhost' identified by '123456';
# 授予用户 learn1 查询、创建、修改 study 数据库的 goods 表的权限
grant select, create, alter on study.goods to 'learn1'@'localhost';
# 查询用户 learn1 权限
show grants for 'learn1'@'localhost';
3.4 授予用户列权限
权限
说明
select(字段)
表示授予用户可以使用 select 语句访问特定列的权限
insert(字段)
表示授予用户可以使用 insert 语句向一个特定列插入数据的权限
update(字段)
表示授予用户可以使用 update 语句更新特定列的权限
# 创建用户 learn2
create user 'learn2'@'localhost' identified by '123456';
# 授予用户 learn2 查询、插入、更新 study 数据库的 goods 表的 name 列的权限
grant select(name), insert(name), update(name) on study.goods to 'learn2'@'localhost';
# 查询用户 learn2 权限
show grants for 'learn2'@'localhost';
4 查询权限
使用 show grants; 查询 root 的权限时会出错
# 查询当前用户权限
# show grants();
# 查询特定用户权限,如 learn2
show grants for 'learn2'@'localhost';
5 回收权限
回收权限格式
revoke [权限1,权限2,权限3] on [数据库].[表名] from [用户名]@[访问地址]
注意回收权限是回收已经授予的权限,不能回收没有的权限
# 回收用户 learn2 插入、更新 study 数据库的 goods 表的 name 列的权限
revoke insert(name), update(name) on study.goods from 'learn2'@'localhost';
# 查询你 用户 learn2 的权限
show grants for 'learn2'@'localhost';
差分其实就是前缀和的逆运算。
如果数组 A 是数组 B 的前缀和数组,则称 B 是 A 的差分数组。
思路
由题意得,应该求给定数组的差分数组。
差分加速的原理
对 L 到 R 区间内的数加上 c,时间复杂度是O(c) ,即O(n) 。
但是如果…