对数据库有关的请求(insert、update等等),服务器首先通过查找user 表条目来检查用户的全局(超级用户)权限。如果条目允许请求的操作,存取被授权。如果在user 表中全局权限不够,服务器通过检查db 和host 表确定特定的用户数据库权限:
- 服务器在
db 表的Host 、Db 和User 字段上查找一个匹配。Host 和User 对应连接用户的主机名和MySQL用户名。Db 字段对应用户想要存取的数据库。如果没有Host 和User 的条目,存取被拒绝。
- 如果
db 表中的条目有一个匹配而且它的Host 字段不是空白的,该条目定义用户的数据库特定的权限。
- 如果匹配的
db 表的条目的Host 字段是空白的,它表示host 表列举主机应该被允许存取数据库的主机。在这种情况下,在host 表中作进一步查找以发现Host 和Db 字段上的匹配。如果没有host 表条目匹配,存取被拒绝。如果有匹配,用户数据库特定的权限以在db 和host 表的条目的权限,即在两个条目都是Y 的权限的交集(而不是并集!)计算。(这样你可以授予在db 表条目中的一般权限,然后用host 表条目按一个主机一个主机为基础地有选择地限制它们。)
在确定了由db 和host 表条目授予的数据库特定的权限后,服务器把他们加到由user 表授予的全局权限中。如果结果允许请求的操作,存取被授权。否则,服务器检查在tables_priv 和columns_priv 表中的用户的表和列权限并把它们加到用户权限中。基于此结果允许或拒绝存取。
用布尔术语表示,前面关于一个用户权限如何计算的描述可以这样总结: globalprivilegesOR(databaseprivilegesANDhostprivileges)ORtableprivilegesORcolumnprivileges (编辑:aniston)
|