最近在做公司项目的过程中,出现了这样的需求。第三方系统需要将数据写到我们的业务系统中,由于目前这些数据没有实际的使用场景,在讨论下,为简单快捷,选择第二种方案,即不书写接口,第三方系统通过数据库直接将数据写入到业务系统的数据库中。但是呢又不能将ROOT用户分配给第三方,所以在数据库建立私有用户,指定用户只能访问指定的数据库中的表。
我们的数据库版本 MySQL 8.0.19
1、已有数据库就不进行创建啦,名称(dbTestErp)
2、创建用户并设置密码
create user usertwo@'%' identified by '123qwe';
'%' - 所有情况都能访问
'localhost' - 本机才能访问
'192.168.0.1' - 指定 ip 才能访问
3、授予该用户访问该数据库时的权限
grant select,insert on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option;
//将数据库的所有权限赋给这个用户
grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option;
'%' - 所有情况都能访问
'localhost' - 本机才能访问
'192.168.0.1' - 指定 ip 才能访问
例子:
1、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option;
2、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@localhost with grant option;
3、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@192.168.0.1 with grant option;
3.1注:最好不要将所有权限赋值给除root以外的用户
在MySQL8.0中,如果创建了用户并授予了 all 权限,那么即便用 root 用户也可能无法删除这些用户。会报 ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
【原因】由于MySQL 8.0新增了一个SYSTEM_USER权限,如果创建用户并授予 all 权限时,就会赋予SYSTEM_USER权限,而root用户并没有这个权限,所以无法删除其他用户
【解决】授予root用户SYSTEM_USER,然后删除其他用户
show grants for 'root'@'%';
grant SYSTEM_USER on *.* to 'root'@'%';
flush privileges;
drop user 'test'@'%';
3.2、with grant option 可以省略,也可以加,但是加后会出现一些问题。
with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定with grant option 选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
3.3、下面为MySQL 5.7 授权命令
grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' identified by '123456';
当在 MySQL 8.0.19 中使用上述命令时会出现下面的错误。查看数据库版本,高版本数据库不能按照上面的方式进行授权;
在高版本中修改用户权限,必须分两步来实现设置用户权限【先创建用户、再对该用户分配用户权限】
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by '123qwe'' at line 1
4、刷新权限,否则可能无法立即生效。
flush privilege;