服务器接受连接后,进入访问控制的第二阶段。对于您通过连接发出的每个请求,服务器确定您想执行什么操作,然后检查您的特权是否足够。这就是授予表中的特权列发挥作用的地方。这些特权可以来自任何用户
那global_grants
那D b
那tables_priv
那columns_priv
, 或者procs_priv.
表。)参考一下可能会有帮助第6.2.3节,“授予表”,其中列出了每个授权表中存在的列。)
这用户
和global_grants
表格授予全局权限。对于给定帐户的这些表中的行表示无论默认数据库是什么,都会在全球范围内应用的帐户权限。例如,如果用户
表格授予您删除
特权,您可以从服务器主机上的任何数据库中的任何表中删除行。授予特权是明智的用户
表仅提供给需要它们的人,如数据库管理员。对于其他用户,保留所有权限用户
表设置为'n'
并仅在更具体的级别(特定数据库,表,列或例程)授予权限。也可以在全球范围内授予数据库权限,但使用部分revikes来限制它们在特定数据库上行使(见第6.2.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
列,所以不需要检查。)
用于与数据库相关的请求(插
那更新
等等),服务器首先检查用户的全局权限用户
表行(不包括部分撤销强加的任何特权限制)。如果该行允许请求的操作,则授予访问权限。如果全局权限在用户
表不够时,服务器从D b
表:
服务器在
D b
表上的一个匹配主持人
那D b
, 和用户
列。这
主持人
和用户
列与连接用户的主机名和MySQL用户名匹配。这
D b
列与用户想要访问的数据库匹配。如果没有行
主持人
和用户
,拒绝访问。
在确定授予的数据库特权后D b
表行,服务器将它们添加到授予的全局权限用户
表格如果结果允许请求的操作,则授予访问权限。否则,服务器将依次检查用户的表和列权限tables_priv
和columns_priv
表,将那些添加到用户的权限,并允许基于结果的访问权限。对于存储 - 例行操作,服务器使用procs_priv.
表而不是tables_priv
和columns_priv
。
在布尔术语中表达,所先的描述如何计算用户权限的描述可以概括如下:
全局权限或数据库权限或表权限或列权限或例行权限
它可能是显而易见的原因,如果最初发现全局权限对所请求的操作不足,则服务器将这些权限添加到数据库,表和列权限。原因是请求可能需要多种类型的特权。例如,如果你执行一个插入...选择
声明,你需要两者插
和选择
特权。你的特权可能是这样的用户
表行授予一个全局权限和D b
表行专门针对相关数据库授予另一个。在这种情况下,您有必要的权限来执行请求,但服务器无法从您的全局或数据库权限中判断。它必须基于组合权限进行访问控制决策。