我在服务器上有多个MySQL数据库,分别是DB 1,mysql和DB2。我创建了一个用户UserA。我只想撤消对单个DB(例如mysql)对User A的访问,因为它将有多个日志表。我尝试了无法正常使用的基本REVOKE语法。
revoke select on mysql.* from user@localhost;
请注意,撤消应该仅对mysql DB发生,而不对DB 1和DB 2发生。
答案 0 :(得分:1)
Before MySQL 8.0.16,您不能substract privileges,
用户对数据库,表,列或例程拥有的特权是作为每个特权级别(包括全局级别)的帐户特权的逻辑或而形成的。无法通过在较低级别上缺少该特权来拒绝在较高级别上授予的特权。
尝试这样做会给您类似的错误
错误代码:1141。在主机“ localhost”上没有为用户“ user”定义此类授权
您必须分别为所有数据库添加权限,例如专门允许db1和db2,而不是全部允许并删除mysql。
Starting with MySQL 8.0.16,您最终可以删除对单个数据库的访问权限(但目前仅在数据库上,而不是在单个表或列上):
从MySQL 8.0.16开始,如果启用了partial_revokes系统变量,则可以通过取消特定数据库的特权来显式拒绝在全局级别授予的特权:
GRANT SELECT, INSERT, UPDATE ON *.* TO u1; REVOKE INSERT, UPDATE ON db1.* FROM u1;
为此必须设置partial_revokes
系统变量:
启用此变量使得可以部分撤销特权。具体来说,对于在全局级别上具有特权的用户,partial_revokes可以撤消特定模式的特权,而保留其他模式的特权。例如,可以限制具有全局UPDATE特权的用户在mysql系统架构上行使此特权。 (或者,换句话说,使用户能够在除mysql模式之外的所有模式上行使UPDATE特权。)从某种意义上说,部分撤销了用户的全局UPDATE特权。
加粗标记部分正是您要执行的操作。