Mysql 简明教程

MySQL - REVOKE Statement

前面, 我们讨论了 root 用户如何在安装后通过默认权限访问 MySQL 服务器。这些权限足以对数据执行基本操作。然而, 在某些特殊情况下, 用户可能需要向服务器主机请求取消某些权限。要做到这一点, 我们使用 MySQL REVOKE 语句。

The MySQ REVOKE statement

MySQL REVOKE 语句用于从用户处删除某些管理权限或角色。它撤销先前授予的权限。

Syntax

以下是 MySQL REVOKE 语句的语法 −

REVOKE privileges
   ON database_name.table_name
   FROM 'user'@'host';

Example

假设我们使用 CREATE USER 语句在 MySQL 中创建了一个名为 'test_user'@'localhost' 的用户, 如下所示 −

CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'testpassword';

下面是生成的输出−

Query OK, 0 rows affected (0.23 sec)

现在, 让我们创建一个名为 'test_database' 的数据库 −

CREATE DATABASE test_database;

输出结果如下:

Query OK, 1 row affected (0.56 sec)

接下来,我们将使用已创建的数据库——

USE test_database;

我们得到了如下输出 −

Database changed

现在,让我们在数据库中创建一个表——

CREATE TABLE MyTable(data VARCHAR(255));

获得的输出如下 −

Query OK, 0 rows affected (0.67 sec)

grants privileges 查询应用于上面创建的表格, 给 'test_user'@'localhost −

GRANT SELECT ON test_database.MyTable TO 'test_user'@'localhost';

执行上面的代码后,我们得到以下输出: -

Query OK, 0 rows affected (0.31 sec)

您可以使用 SHOW GRANTS 语句验证已授予的权限——

SHOW GRANTS FOR 'test_user'@'localhost';

我们获得的输出如下所示——

现在, 您可以使用 REVOKE statement 撤销上述授予的权限, 如下所示 −

REVOKE SELECT ON test_database.MyTable FROM 'test_user'@'localhost';

我们得到了如下输出 −

Query OK, 0 rows affected (0.25 sec)

Verification

我们可以使用 SHOW GRANTS 语句验证是否已撤销 SELECT 权限, 如下所示 −

SHOW GRANTS FOR 'test_user'@'localhost';

我们可以看到, 输出不再列出 SELECT 权限, 这表明它已被撤销 −

Revoking All Privileges

如果用户对一个用户拥有多个权限, 你可以使用 MySQL 中的 REVOKE ALL 语句一次性撤销所有这些权限。

Syntax

以下是撤销 MySQL 中所有权限的语法 −

REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host';

Example

假设我们创建了一个用户, 如下所示 −

CREATE USER 'sample_user'@'localhost';

下面是生成的输出−

Query OK, 0 rows affected (0.18 sec)

我们还创建了一个过程, 如下所示 −

DELIMITER //
CREATE PROCEDURE sample ()
   BEGIN
      SELECT 'This is a sample procedure';
   END//
DELIMITER ;

获得的输出如下 −

Query OK, 0 rows affected (0.29 sec)

此外,我们在数据库中创建一个名为“sample”的表 −

CREATE TABLE sample(data INT);

我们得到了如下输出 −

Query OK, 0 rows affected (0.68 sec)

现在,以下查询向名为 'sample_user'@'localhost' 的用户授予对上述创建过程的 ALTER ROUTINE、EXECUTE 权限。

GRANT ALTER ROUTINE, EXECUTE
ON PROCEDURE test_database.sample TO 'sample_user'@'localhost';

以上代码的输出如下所示 −

Query OK, 0 rows affected (0.20 sec)

同样,以下查询向用户“sample_user”@“localhost”授予对表“sample”的 SELECT、INSERT 和 UPDATE 权限 −

GRANT SELECT, INSERT, UPDATE
ON test.sample TO 'sample_user'@'localhost';

生成的结果为 −

Query OK, 0 rows affected (0.14 sec)

您可以使用 SHOW GRANTS 语句验证授予用户的全部权限清单 −

SHOW GRANTS FOR 'sample_user'@'localhost';

获得的结果如下 −

最后,要 revoke all the privileges 授予的“sample_user”@'localhost',可以使用以下语句 −

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'sample_user'@'localhost';

生成的结果为 −

Query OK, 0 rows affected (0.30 sec)

Verification

撤销权限后,可以再次检查用户的授权 −

SHOW GRANTS FOR 'sample_user'@'localhost';

下面的输出确认已撤销所有权限 −

Revoking Proxy Privilege

您可以通过向用户授予 PROXY 权限,使其成为另一个用户的代理。如果您这样做,则这两个用户拥有相同的权限。

Example

假设我们在 MySQL 中使用 CREATE 语句创建了名为 sample_user, proxy_user 的用户 −

CREATE USER sample_user, proxy_user IDENTIFIED BY 'testpassword';

以下是所获得的输出 −

Query OK, 0 rows affected (0.52 sec)

现在,我们正在创建一个表“Employee” −

CREATE TABLE Employee (
ID INT, Name VARCHAR(15), Phone INT, SAL INT);

我们得到了如下输出 −

Query OK, 0 rows affected (6.47 sec)

以下查询向用户 sample_user 授予对上述创建表上的 SELECT 和 INSERT 权限 −

GRANT SELECT, INSERT ON Emp TO sample_user;

获得的输出如下 −

Query OK, 0 rows affected (0.28 sec)

现在,我们可以使用 GRANT 语句向用户 proxy_user 分配代理权限,如下所示 −

GRANT PROXY ON sample_user TO proxy_user;

生成的结果为 −

Query OK, 0 rows affected (1.61 sec)

您可以使用 REVOKE PROXY 语句撤消代理权限,如下所示 −

REVOKE PROXY ON sample_user FROM proxy_user;

我们获得以下结果 −

Query OK, 0 rows affected (0.33 sec)

Revoking a Role

MySQL 中的角色是一组带有名称的权限。您可以使用 CREATE ROLE 语句在 MySQL 中创建一个或多个角色。如果您不使用 ON 子句使用 GRANT 语句,您可以授予角色而不是权限。

Example

以下查询创建一个名为 TestRole_ReadOnly 的角色 −

CREATE ROLE 'TestRole_ReadOnly';

以下是上面代码的输出: -

Query OK, 0 rows affected (0.13 sec)

现在,让我们使用 GRANT 语句授予创建的角色只读权限 −

GRANT SELECT ON * . * TO 'TestRole_ReadOnly';

获得的结果是 −

Query OK, 0 rows affected (0.14 sec)

然后,您可以按如下方式授予创建的角色给用户 −

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

上述代码的输出如下:

Query OK, 0 rows affected (0.14 sec)

接下来,可以将“TestRole_ReadOnly” 角色授予 'newuser'@'localhost' −

GRANT 'TestRole_ReadOnly' TO 'newuser'@'localhost';

我们获得以下结果 −

Query OK, 0 rows affected (0.13 sec)

以下查询将从用户那里撤销角色 −

REVOKE 'TestRole_ReadOnly' FROM 'newuser'@'localhost';

执行上面的代码后,我们得到以下输出: -

Query OK, 0 rows affected (1.23 sec)

Revoking Privileges Using a Client Program

我们还可以使用客户端程序从 MySQL 用户那儿收回权限。

Syntax

以下是各种编程语言中吊销 MySQL 权限的语法 −

Example

以下是该操作在各种编程语言中的实现 −