MySQL的权限系统围绕着两个概念:
1:认证——确定用户是否允许连接数据库服务器;
2:授权——确定用户是否拥有足够的权限执行查询请求等。
与权限相关的表有user,db,host,tables_priv,columns_priv。每个表的字段都可分为两类,一类为作用域字段,一类为权限字段。作用域字段用来标识主机、用户或者数据库;而权限字段则用来确定对于给定主机、用户或者数据库来说,哪些动作是允许的。
可以用SHOW CREATETABLE mysql.user;来查看建立user表的语句。同样也可以查看其它表的建立语句。
user表在某种程度上是独一无二的,因为它是唯一一个在权限请求的认证和授权阶段都起作用的表。在认证阶段,它只是负责为用户授权访问MySQL服务器,确定用户每小时的最大连接数和最大并发数;在授权阶段,user确定允许访问服务器的用户是否被赋予了操作数据库的全局权限,确定用户每小时的最大查询数和更新数。
一旦连接到了服务器,一个用户可以使用两种类型的请求:
管理请求(shutdown,reload,等)
数据库相关的请求(insert,delete,等)
当用户提交管理请求时,服务器只需查看user表,这是因为user表是唯一包含与管理工作有关的权限的一个表。然而,当用户提交数据库请求时,要查看的表就要更多了。
进行权限分配时,按照user,db,tables_priv,columns_priv的顺序进行分配。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
tables_priv和columns_priv表
通配符可以用于这两个表的host字段,但是不允许在Db、Table_name和Column_name字段使用通配符。
权限字段被声明为SET字段。
tables_priv和columns_priv表只应当通过GRANT/REVOKE命令进行修改。通过INSERT命令向这两个表插入数据会导致服务器不稳定!
tables_priv表中的table_priv字段可以允许下列命令:Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。
tables_priv表中的column_priv字段允许下列命令:Select、Insert、Update和References。
columns_priv表中的type字段允许下列命令:Select、Insert、Update和References。
参考文献
MySQL权限系统
http://blog.csdn.net/liuyuan185442111/article/details/42793805
深入学习MySQL授权表
http://tech.it168.com/a2010/0114/837/000000837456.shtml