如何撤销MySQL用户对一个表的权限?

4
当我为某些特定的表授予用户权限时:
GRANT ALL PRIVILEGES ON table1.* TO 'user1'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON table2.* TO 'user1'@'localhost' IDENTIFIED BY 'password';

我该如何撤销此用户的权限,仅限于table1
2个回答

11

谷歌是你的朋友! http://dev.mysql.com/doc/refman/5.7/en/revoke.html

语法:

REVOKE ALL PRIVILEGES ON table1.* FROM 'user1'@'localhost';

为了更好地解释这个答案,我将教你如何钓鱼(而不是仅仅给你一条鱼)。

MySQL文档一开始可能看起来很令人困惑——REVOKE的“语法”看起来像这样:


REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...

REVOKE PROXY ON user
    FROM user [, user] ...

这意味着有三种调用方式:

  1. REVOKE priv_type ...
  2. REVOKE ALL PRIVILEGES, GRANT ...
  3. REVOKE PROXY ON ...

这三种方式在MySQL文档页面中用空行分隔。

对于每一种方式,都有“可选”的参数/设置/值。这些用方括号表示,例如:

REVOKE priv_type [(column_list)] ...

(column_list)是可选的。你可以提供它,但是不一定必须要提供。

(更新注释,2019年12月:

priv_type特别告诉我们可以指定ALL PRIVILEGES; 因为在上面链接的文档中告诉我们:

有关权限存在的级别、允许使用的priv_typepriv_levelobject_type values以及指定用户和密码的语法的详细信息,请参见第13.7.1.4节,“GRANT Statement”。

第13.7.1.4节说明如下:

MySQL支持的权限

以下表格总结了可以为GRANTREVOKE语句指定的允许priv_type权限类型以及每个权限可以被授予的级别。

  • ALL [PRIVILEGES] 在指定的访问权限上授予所有权限

更新结束。)

同样,您可以将它们链接在一起 - 它们缩进了下一行以指示这一点(并使用...来显示您可以继续重复):

priv_type [(column_list)]
  [, priv_type [(column_list)]] ...    <-- indented, and note the "..."

MySQL文档中存在更复杂的例子-例如对于CREATE TABLE,您有可选标志的列表:

[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
{x|y|z}语法表示您必须指定其中之一({...}是必需的,[...]表示内部所有内容都是可选的 - 因此如果指定了COLUMN_FORMAT,则需要以下三个标志中的一个),竖杠(|)表示只能指定列表中的一个FIXED / DYNAMIC / DEFAULT)。
还有一件事要说 - 非常注意 MySQL 文档的版本。 网站的几个地方都有说明 - 我个人只看 URL:
http://dev.mysql.com/doc/refman/5.7/en/create-table.html

注意其中写着5.7。这意味着你正在阅读的文档可能不适用于MySQL 5.7以外的任何版本。这在我着急修复问题时常常发生...一定要仔细检查。


扩展回答以帮助解释MySQL文档的格式。 - wally
1
这里的示例答案特别有帮助,因为文档并没有明确说明 REVOKE ALL 可以与 ON 过滤器一起使用。谢谢。 - Jeffrey Froman
添加了关于我们如何知道ALL PRIVILEGES有效的澄清。 - wally

3

@Nadeem Taj。你是错误的。如果你之前授予了所有权限。

REVOKE ALL PRIVILEGES on Tblname.* 把 Tblname 视为模式名称。

证明:

mysql<root@127.0.0.1:[amp]> create user 'myuser'@'%' identified by 'password';
Query OK, 0 rows affected (0.02 sec)

mysql<root@127.0.0.1:[mysql]> grant all privileges on  *.* to 'myuser'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql<root@127.0.0.1:[mysql]> create database specialdb;
Query OK, 1 row affected (0.01 sec)

mysql<root@127.0.0.1:[mysql]> use specialdb;
Database changed
mysql<root@127.0.0.1:[specialdb]> create table tbl1(col1 int primary key);
Query OK, 0 rows affected (0.03 sec)

mysql<root@127.0.0.1:[mysql]> insert into specialdb.tbl1(col1) values(1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql<root@127.0.0.1:[specialdb]> REVOKE ALL PRIVILEGES ON tbl1.* FROM 'myuser'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql<root@127.0.0.1:[specialdb]> exit
Bye

$ mysql mysql  -umyuser -p
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql<myuser@127.0.0.1:[mysql]> select * from specialdb.tbl1;
+------+
| col1 |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.01 sec)

mysql<myuser@127.0.0.1:[mysql]> 

你在回答中指的是谁?这个人不在问题或答案部分。 - mishsx
@mishsx 我指的是“隐藏”了我之前回复的人。这篇文章证明了当某人在所有模式中被授予所有特权时,接受的答案是无效的。此外,MySQL确实支持部分撤销,但仅适用于模式级别。 - Noel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接