在服务器接受连接之后,它进入访问控制的阶段2。对于您通过连接发出的每个请求,服务器确定要执行的操作,然后检查您的权限是否足够。这是Grant表中的特权列的播放。这些特权可以来自任何一个用户
那global_grants.
那D b
那tables_priv.
那columns_priv.
, 或者procs_priv.
表。(你可能会发现它有助于参考第4.3节“授予表”,其中列出了每个授权表中存在的列。)
这用户
和global_grants.
表格授予全局权限。对于给定帐户的这些表中的行表示无论默认数据库是什么,都会在全球范围内应用的帐户权限。例如,如果用户
表授予你删除
权限,您可以从服务器主机上任何数据库中的任何表中删除行。授予特权是明智的用户
表仅适用于需要它们的人,如数据库管理员。对于其他用户,请留下所有特权用户
表设置为'n'
并仅在更具体的级别(特定数据库,表,列或例程)授予权限。也可以在全球范围内授予数据库权限,但使用部分revikes来限制它们在特定数据库上行使(见第4.12节“使用部分撤销的特权限制”)。
这D b
表格授予特定于数据库特权。此表的范围列中的值可以采用以下形式:
服务器读取D b
表中的内存并同时对其进行读取用户
桌子。服务器排序D b
表基于主持人
那D b
, 和用户
范围列。和我们一样用户
表,排序将最特定于特定的值持续到最小的值,并且当服务器查找匹配行时,它使用它找到的第一个匹配项。
这tables_priv.
那columns_priv.
, 和procs_priv.
表格授予特定于表特定的列和特定于例行的特权。这些表的范围列中的值可以采用以下形式:
通配符
%
和_
可以用在主持人
柱子。这些具有与模式匹配的模式匹配操作相同的含义与喜欢
操作员。一种
'%'
或空白主持人
价值手段“任何主持人。“这
D b
那table_name.
那column_name.
, 和rutine_name.
列不能包含通配符或空白。
服务器排序tables_priv.
那columns_priv.
, 和procs_priv.
基于的表主持人
那D b
, 和用户
列。这类似于D b
表排序,但更简单,因为只有主持人
列可以包含通配符。
服务器使用排序表来验证其接收的每个请求。对于需要行政权限的请求,例如关掉
或者重新加载
,服务器只检查用户
和global_privilege.
表,因为这些是唯一可以指定管理权限的表。如果在这些表中的帐户中的一行允许请求的操作并拒绝否则,则服务器授予访问权限。例如,如果要执行mysqladmin关闭但是你的用户
表行不授予关掉
服务权限,服务器拒绝访问而无需检查D b
桌子。(后一张表包含否shutdown_priv.
列,所以没有必要检查它。)
用于与数据库相关的请求(插
那更新
等等),服务器首先检查用户的全局权限用户
表行(少于部分revikes施加的任何特权限制)。如果该行允许请求的操作,则授予访问权限。如果是全球特权用户
表不足,服务器确定用户的数据库特定权限D b
桌子:
服务器看起来
D b
匹配的表主持人
那D b
, 和用户
列。这
主持人
和用户
列与连接用户的主机名和MySQL用户名匹配。这
D b
列与用户想要访问的数据库匹配。如果没有行
主持人
和用户
,访问被拒绝。
在确定授予的数据库特权后D b
表行,服务器将它们添加到授予的全局权限用户
桌子。如果结果允许请求的操作,则授予访问权限。否则,服务器连续检查用户的表和列权限tables_priv.
和columns_priv.
表,将那些添加到用户的权限,并允许基于结果的访问权限。对于存储 - 例行操作,服务器使用procs_priv.
表而不是tables_priv.
和columns_priv.
。
在布尔术语中表达,所先的描述如何计算用户权限的描述可以概括如下:
全局权限或数据库权限或表权限或列权限或例行权限
它可能是显而易见的原因,如果最初发现全局权限对所请求的操作不足,则服务器将这些权限添加到数据库,表和列权限。原因是请求可能需要多种类型的特权。例如,如果你执行一个插入...选择
声明,你需要两者插
和选择
特权。你的特权可能是这样的用户
表行授予一个特权全球和D b
表行专门针对相关数据库授予另一个。在这种情况下,您有必要的权限来执行请求,但服务器无法从您的全局或数据库权限中判断。它必须基于组合权限进行访问控制决策。