如何撤销一个 table 的 MySQL 用户权限?
How to revoke MySQL user privileges for one table?
当我向用户授予某些特定表的权限时:
GRANT ALL PRIVILEGES ON table1.* TO 'user1'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON table2.* TO 'user1'@'localhost' IDENTIFIED BY 'password';
我如何撤销此用户的权限,仅用于 table1
?
Google是你的朋友!
http://dev.mysql.com/doc/refman/5.7/en/revoke.html
语法:
REVOKE ALL PRIVILEGES ON table1.* FROM 'user1'@'localhost';
为了进一步解释这个答案——我会教你如何钓鱼(而不是只给你一条鱼)。
MySQL 文档乍一看可能令人困惑 - REVOKE
的 "syntax" 看起来像这样:
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] ...
表示有3次"ways"调用:
REVOKE priv_type ...
REVOKE ALL PRIVILEGES, GRANT ...
REVOKE PROXY ON ...
这三个在 MySQL 文档页面中由空行分隔。
对于其中的每一个,都有 "optional" parameters/settings/values。这些由方括号表示,例如:
REVOKE priv_type [(column_list)] ...
(column_list)
是可选的。你可以提供它,但你没有。
(更新说明,2019 年 12 月:
priv_type
是让我们知道我们可以指定 ALL PRIVILEGES
的具体内容;因为我们在上面链接的文档中被告知:
For details on the levels at which privileges exist, the permissible priv_type
, priv_level
, and object_type values
, and the syntax for specifying users and passwords, see Section 13.7.1.4, “GRANT
Statement”.
第 13.7.1.4 节指出:
Privileges Supported by MySQL
The following table summarizes the permissible priv_type privilege types that can be specified for the GRANT
and REVOKE
statements, and the levels at which each privilege can be granted.
ALL [PRIVILEGES]
Grant all privileges at specified access
结束更新。)
同样,您可以将它们链接在一起 - 他们在下一行缩进以表明这一点(并使用 ...
表明您可以继续重复):
priv_type [(column_list)]
[, priv_type [(column_list)]] ... <-- indented, and note the "..."
MySQL 文档中存在更复杂的示例 - 例如 CREATE TABLE
您有可选标志列表:
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
这个{x|y|z}
语法表明你必须指定其中之一({...}
是non-optional,[...]
意味着里面的所有内容都是可选的 - 因此如果您指定 COLUMN_FORMAT
,则以下三个标志之一是 必需的 ),竖线(|
)表示您只能指定 列表中的一个 (FIXED
/ DYNAMIC
/ DEFAULT
).
最后要说的一件事 - 请非常注意 MySQL 文档 版本 。它在网站上的几个地方都有说明 - 我个人只看 URL:
http://dev.mysql.com/doc/refman/5.7/en/create-table.html
注意里面写着5.7
。这意味着您正在阅读的文档 可能 不适用于 MySQL 5.7 以外的任何版本。这让我困扰了很多次……通常是当我在枪口下试图在恐慌中修复某些东西时!总是double-check它。
@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]>
当我向用户授予某些特定表的权限时:
GRANT ALL PRIVILEGES ON table1.* TO 'user1'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON table2.* TO 'user1'@'localhost' IDENTIFIED BY 'password';
我如何撤销此用户的权限,仅用于 table1
?
Google是你的朋友! http://dev.mysql.com/doc/refman/5.7/en/revoke.html
语法:
REVOKE ALL PRIVILEGES ON table1.* FROM 'user1'@'localhost';
为了进一步解释这个答案——我会教你如何钓鱼(而不是只给你一条鱼)。
MySQL 文档乍一看可能令人困惑 - REVOKE
的 "syntax" 看起来像这样:
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] ...
表示有3次"ways"调用:
REVOKE priv_type ...
REVOKE ALL PRIVILEGES, GRANT ...
REVOKE PROXY ON ...
这三个在 MySQL 文档页面中由空行分隔。
对于其中的每一个,都有 "optional" parameters/settings/values。这些由方括号表示,例如:
REVOKE priv_type [(column_list)] ...
(column_list)
是可选的。你可以提供它,但你没有。
(更新说明,2019 年 12 月:
priv_type
是让我们知道我们可以指定 ALL PRIVILEGES
的具体内容;因为我们在上面链接的文档中被告知:
For details on the levels at which privileges exist, the permissible
priv_type
,priv_level
, andobject_type values
, and the syntax for specifying users and passwords, see Section 13.7.1.4, “GRANT
Statement”.
第 13.7.1.4 节指出:
Privileges Supported by MySQL
The following table summarizes the permissible priv_type privilege types that can be specified for the
GRANT
andREVOKE
statements, and the levels at which each privilege can be granted.
ALL [PRIVILEGES]
Grant all privileges at specified access
结束更新。)
同样,您可以将它们链接在一起 - 他们在下一行缩进以表明这一点(并使用 ...
表明您可以继续重复):
priv_type [(column_list)]
[, priv_type [(column_list)]] ... <-- indented, and note the "..."
MySQL 文档中存在更复杂的示例 - 例如 CREATE TABLE
您有可选标志列表:
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
这个{x|y|z}
语法表明你必须指定其中之一({...}
是non-optional,[...]
意味着里面的所有内容都是可选的 - 因此如果您指定 COLUMN_FORMAT
,则以下三个标志之一是 必需的 ),竖线(|
)表示您只能指定 列表中的一个 (FIXED
/ DYNAMIC
/ DEFAULT
).
最后要说的一件事 - 请非常注意 MySQL 文档 版本 。它在网站上的几个地方都有说明 - 我个人只看 URL:
http://dev.mysql.com/doc/refman/5.7/en/create-table.html
注意里面写着5.7
。这意味着您正在阅读的文档 可能 不适用于 MySQL 5.7 以外的任何版本。这让我困扰了很多次……通常是当我在枪口下试图在恐慌中修复某些东西时!总是double-check它。
@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]>