我为用户John定义了赠款:
grant select on * to JOHN@localhost;
在跑步时:
show grants for JOHN@localhost;
我得到:
GRANT SELECT ON *.* TO `JOHN`@`localhost`
但当我尝试从特定表中删除grant时,actor:
revoke select on sakila.actor from JOHN@localhost;
它说:
错误代码:1147没有为主机“localhost”上的用户“JOHN”定义表“actor”上的此类授权
会出什么差错呢?
我试图在sakila.*
上单独给予选择赠款,但它仍然无法识别John在actor表上有授权。只有当我显式地grant select to JOHN for sakila.actor
时,它才标识它。
1条答案
按热度按时间xtupzzrd1#
因为,在表
sakila.actor
上没有给予用户JOHN@localhost
的特定授权。所给予的许可是在*
上-即所有数据库所有表。想想这个REVOKE会做什么,如果它被支持的话。
它必须从
*.*
中减去sakila.actor
。这意味着,MySQL必须为该用户添加所有不同的DB.*
赠款,然后为sakila
的所有表添加,除了actor
。MySQL做不到的
MySQL只会撤销显式给出的权限。
如果在
*.*
上给予了权限,则只能撤销这些权限。如果您在
sakila.actor
上给予显式权限,则只能撤销该权限。如果您在sakila.*
上给予显式权限,则只能撤销该权限,依此类推...如果你在
sakila.*
或*.*
上给予权限,然后试图撤销其中一个子集的权限,MySQL不会这样做,因为如果它这样做了,它将不得不实际承担其他所有内容的权限。