数据库4大语句相信大家也都清楚,所谓的crud,就算不了解也听说过,这也是数据库最基础的东西。
如果要是真是不在乎性能安全什么的基本上这四大基本草错也能完成,但是咱们在很多时候其实要考虑的更多,
比方说 事务处理,这个对于一些应用来说,比如钱方面的,没这个的话基本上就废了。
再有其中一个就是本文所讲的 数据库权限,因为不能存在整个mysql完全对外的情况,所有后端随便玩这样出了问题被老板砍死的几率会比较大,往往这个权限方面做的会比较细,mysql对这方面支持的也比较好,比如可以以库为单位,也可以对表为单位,比如指定某一个用户只能在某一个库里的某一个表里进行某一种类型的操作。

权限语句

在数据库里一般语句分为两大类
一大类是专门对数据进行操作的,也就是crud这种
一大类是管理方面的,比如说create 一个 table、database这种命令,咱们说的权限也是属于这种的

  • GRANT - 赋予权限
  • REVOKE - 收回权限

操作权限方法

在数据库里操作权限其实是有两种方法的

  • 正经的方法就是上面说的GRANT和REVOKE
  • 还有就是直接改mysql.user

GRANT、REVOKE 操作权限

GRANT :
  1. GRANT 权限 ON 库.表 TO '用户'@'主机' IDENTIFIED BY '密码' [WITH GRANT OPTION];

这个权限可以直接写如果 要是想给全部权限的话也可以直接给个ALL、只要你心大~
也可以单独给比如:SELECT,UPDATE 逗号隔开,具体名称是啥可以看 ‘mysql.user’ 里的列 ,这里不多赘述

后面的这个IDENTIFIED设计的也是比较有意思的,可以存在同一个主机下的同一个用户但是密码不一样的情况

这个库.表这个简写大家应该也知道比如我现在操作的是mysql,那‘mysql.user’就可以简写成‘user’,一样的,如果要全部权限,那就 .

主机如果也想给所有的话(当然这就离出事而 不远了),理论上可以给个 “%”,%在SQL里是通配符,代表所有。
假设现在现在公司ip是 210.34.65.153

  1. GRANT ALL ON *.* TO '用户'@'210.34.65.153' IDENTIFIED BY '密码';

那么直接这样写也是一样的,权限虽然开放,但是主机是写死的,只要你能防得住公司自己人的情况下。。。

WITH GRANT OPTION: 这个参数是可选的,意思就是说如果不给,那这句话到这就结束了,这个用户就是最终一级,他不能再去建子用户了,如果给了,就代表可以建子账号,当然子用户能分出去的权限仅限他自己有的权限

注意一点,这里的操作只能分配给已有的账户,创建新账户需要另外的权限 并且,还得有GRANT权限,不然的话就算有这个权限但是没有执行这个权限的权限

这里稍微多提一句,如果你这个mysqlserver想要对外开放,不一定对客户端,可能对自己的服务器开放,那你除了这个数据库的权限还有一层防火墙,假设防火墙3306没开那也是过不去的,需要两层都过才可以

例子:

image.png
这里先赋予全部权限;
然后可以用show grants
命令查看用户权限
image.png


REVOKE:
  1. REVOKE 权限 ON 库.表 FROM '用户名'@'主机';

REVOKE 语法层面跟GRANT差不多,也都是权限和角色如果要多个直接加,往后接就好类似:

注意⚠️

如果要撤销全部权限的话需要用另一种写法,该语法将删除命名用户或角色的所有全局,数据库,表,列和例程特权
这里的
user_or_role 就是说可以直接写咱们上边写的 ‘用户名’@’主机’,多个的话就接着后面来个,接着写就行
置于这个role,数据库权限当然可以有角色,不过用法也都差不多,有兴趣可以直接去mysql官网查看删除角色的详细写法 REVOKE

  1. REVOKE ALL PRIVILEGES, GRANT OPTION
  2. FROM user_or_role [, user_or_role]

要使用此REVOKE语法,您必须具有全局CREATE USER 特权或系统架构的UPDATE 特权mysql

例子:
拿上面grants创建的用户来说,建出来是ALL权限,查看权限是这样的:
image.png

image.png
收回SELECT INSERT UPDATE之后查看权限就会是
image.png

已经没有SELECT INSERT UPDATE了

直接操作系统表改权限

这两种方法当然还是推荐用第一种,因为第二种是属于一种野路子的方法,毕竟100次里有1次出问题了那还是有点风险。不过有的时候一些特殊的情况下直接操作系统的用户表也是有可能的,所以在这里说一下
mysql 系统表里的user表就是mysql自己来区分用户的。
image.png

这里方便查看就直接用navicat了。
这里的权限很多、这个表里所有的Y、N 都是权限、这里简单说几个字段的意思
Host:简单的来说这个Host就是说我这条权限对哪个地址好使,比如说 192.168.0.3 下的 root有什么权限,localhost也就是本地好使,外部链接都不认
User:用户名、Host不同可以重复
image.png

这一堆也就是可不可以增删改查
Create:建表建库
Drop:删除表或者删除库
Reload:重启
Shutdown:关闭
等等吧。。。。

权限刷新

有的时候操作完权限会存在不生效的情况,比如把用户删除了还能登进去
可以用

  1. flush privileges;

刷新一下;

查看权限

  1. show grants for 用户名@主机;