首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【MySQL 系列】MySQL 语句篇_DCL 语句

【MySQL 系列】MySQL 语句篇_DCL 语句

作者头像
栗筝i
发布于 2024-03-19 09:37:57
发布于 2024-03-19 09:37:57
3.4K0
举报
文章被收录于专栏:迁移内容迁移内容

DCL( Data Control Language,数据控制语言)用于对数据访问权限进行控制,定义数据库、表、字段、用户的访问权限和安全级别。主要关键字包括 GRANT、 REVOKE 等。

1、MySQL 中的 DCL 语句
1.1、数据控制语言–DCL

DCL( Data Control Language,数据控制语言)用于对数据访问权限进行控制,定义数据库、表、字段、用户的访问权限和安全级别。主要关键字包括 GRANT、 REVOKE 等。

1.2、MySQL 权限概述

MySQL 的 mysql 系统库提供了 user、db、tables_priv、columns_priv、procs_priv、proxies_priv 几个表,用于存放不同权限范围的用户账号相关数据,这些表共同组成了 MySQL 的访问权限控制系统。

MySQL 访问权限控制系统的主要功能是对从给定主机连接到 MySQL 服务器的用户进行身份验证,并校验该用户在该服务器中的数据库对象访问权限(如 SELECT、INSERT、UPDATE 和 DELETE)。另外,还包括管理匿名用户访问和授予特定的 MySQL 权限的功能(如执行 LOAD DATA INFILE 语句和管理操作权限等)。

MySQL 访问权限控制系统的用户界面由几条 SQL 语句组成,如 CREATE USER、GRANT 和 REVOKE。

在服务器内部,MySQL 将权限信息存储在 mysql 系统库的权限表中。MySQL 服务器在启动时将这些表的内容读入内存,后续针对用户的访问控制决策基于权限表的内存副本来实现。

MySQL 访问权限控制系统可以确保只有被允许的(与用户权限匹配的)操作才能够在服务器中执行。当一个用户连接到 MySQL 服务器时,其认证身份由 “请求连接的主机名和用户名” 确定,MySQL 使用 “主机名+用户名” 的方式来识别和区分 “相同主机不同用户” 和 “不同主机相同用户” 发出的请求(例如:从 office.example.com 连接的用户 Lizhengi 和从 home.example.com 连接的用户 Lizhengi 在 MySQL 服务器中实际上是被当作两个不同的连接者来处理的,所以可以设置不同的密码、不同的权限)。

举例:

代码语言:javascript
复制
mysql> show grants for Lizhengi@'localhost';	
+-----------------------------------------------+
| Grants for Lizhengi@localhost						     	|
+-----------------------------------------------+
| GRANT SELECT ON *.* TO 'Lizhengi'@'localhost'	|
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for Lizhengi@'%';	
+-----------------------------------------------+
| Grants for Lizhengi@%											    |
+-----------------------------------------------+
| GRANT SELECT ON *.* TO 'Lizhengi'@'%'				  |
+-----------------------------------------------+
1 row in set (0.00 sec)

当用户使用客户端程序连接到 MySQL 服务器时,MySQL 的访问控制分为如下两个阶段:

  • 阶段 1:服务器根据身份标识(“主机名+用户名” 组成的账号名称)在 MySQL 的访问权限控制表中查询相关信息,以确定需要接受或拒绝该用户的连接(没有查询到就拒绝连接).如果查询到了用户记录,则校验用户提供的账号密码是否正确,如果密码不正确则拒绝连接。 这个阶段的报错信息类似于:ERROR 1045 (28000): Access denied for user 'Lizhengi'@'localhost'(using password: YES)。
  • 阶段 2:用户连接成功之后,服务器会检查用户访问请求中的每个声明,确定是否有足够的权限来执行。例如:如果尝试从数据库的表中查询数据行或从数据库中删除表,服务器将验证该用户否具有该表的 SELECT 权限或数据库的 DROP 权限。 如果无对应权限,则这个阶段的报错信息类似于:ERROR 1142 (42000) at line 1: UPDATE command denied to user'Lizhengi'@'localhost' for table 'test_table1'。

如果某用户在连接期间发生了权限变更(自己或者其他用户修改了权限),那么该用户执行下一条语句时,该权限变更不一定会立即生效。如果未生效,则需要执行 FLUSH PRIVILEGES; 语句。

2、MySQL 中库表的 DQL 语句详解
2.1、MySQL 服务器登录

启动 MySQL 服务后,可以通过 mysql 命令来登录 MySQL 服务器,命令如下:

代码语言:javascript
复制
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"

下面详细介绍命令中的参数:

  • -h 参数:后面接主机名或者主机 IP,hostname 为主机,hostIP为 主机IP
  • -P 参数:后面接 MySQL 服务的端口,通过该参数连接到指定的端口。MySQL 服务的默认端口是 3306,不使用该参数时自动连接到 3306 端口,port 为连接的端口号
  • -u 参数:后面接用户名,username 为用户名
  • -p 参数:会提示输入密码
  • DatabaseName 参数:指明登录到哪一个数据库中。如果没有该参数,就会直接登录到 MySQL 数据库中,然后可以使用 USE 命令来选择数据库
  • -e 参数:后面可以直接加 SQL 语句。登录 MySQL 服务器以后即可执行这个 SQL 语句,然后退出 MySQL 服务器

举例:

代码语言:javascript
复制
mysql -u root -p -h localhost -P 3306 mysql -e "select host,user from user"
2.2、创建用户

用户是 MySQL 认证的基本元素。您只能通过正确的用户名和密码登录进 MySQL 数据库,然后授予用户不同的权限,以便让不同的用户可以进行不同的操作。

创建用户是精确控制权限的第一步。

在 MySQL 中,您可以使用 CREATE USER 语句在数据库服务器中创建一个新用户。

CREATE USER 语句的基本语法形式如下:

代码语言:javascript
复制
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
  • 用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成
  • [ ]表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用IDENTIFIED BY指定明文密码值
  • CREATE USER语句可以同时创建多个用户

举例:

代码语言:javascript
复制
CREATE USER zhang3 IDENTIFIED BY '123123'; -- 默认host是 %
CREATE USER 'robofly'@'localhost' IDENTIFIED BY '123456';
2.3、修改用户

修改用户名:

代码语言:javascript
复制
UPDATE mysql.user SET USER='li4' WHERE USER='wang5';  
FLUSH PRIVILEGES;
2.4、删除用户

方式1:使用 DROP 方式删除(推荐)

使用 DROP USER 语句来删除用户时,必须用于 DROP USER 权限。DROP USER 语句的基本语法形式如下:

代码语言:javascript
复制
DROP USER user[,user]…;

举例:

代码语言:javascript
复制
DROP USER li4 ; 															# 默认删除host为%的用户  
DROP USER 'robofly'@'localhost';

方式2:使用 DELETE 方式删除

代码语言:javascript
复制
DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;

FLUSH PRIVILEGES;															# 执行完 DELETE 命令后要使用 FLUSH 命令来使用户生效

举例:

代码语言:javascript
复制
DELETE FROM mysql.user WHERE Host='localhost' AND User='Emily';  
FLUSH PRIVILEGES;

注意:不推荐通过 DELETE FROM USER u WHERE USER='lizhengi' 进行删除,系统会有残留信息保留。而 DROP USER 命令会删除用户以及对应的权限,执行命令后你会发现 mysql.user 表和 mysql.db 表的相应记录都消失了。

2.5、设置当前用户密码

旧的写法如下 :

代码语言:javascript
复制
# 修改当前用户的密码:(MySQL5.7测试有效)  
SET PASSWORD = PASSWORD('123456');

这里介绍推荐的写法 :使用 `ALTER USER· 命令来修改当前用户密码。

用户可以使用 ALTER 命令来修改自身密码,如下语句代表修改当前登录用户的密码。基本语法如下:

代码语言:javascript
复制
ALTER USER USER() IDENTIFIED BY 'new_password';

使用 SET 语句来修改当前用户密码。

使用 root 用户登录 MySQ L后,可以使用 SET 语句来修改密码,具体 SQL语句如下:

代码语言:javascript
复制
SET PASSWORD='new_password';

该语句会自动将密码加密后再赋给当前用户。

2.6、修改其他用户密码

使用 ALTER 语句来修改普通用户的密码。

可以使用 ALTER USER 语句来修改普通用户的密码。基本语法形式如下:

代码语言:javascript
复制
ALTER USER user [IDENTIFIED BY '新密码']  
[,user[IDENTIFIED BY '新密码']]…;

使用 SET 命令来修改普通用户的密码。

使用 root 用户登录到 MySQL 服务器后,可以使用 SET 语句来修改普通用户的密码。SET 语句的代码如下:

代码语言:javascript
复制
SET PASSWORD FOR 'username'@'hostname'='new_password';

使用 UPDATE 语句修改普通用户的密码(不推荐)。

代码语言:javascript
复制
UPDATE MySQL.user SET authentication_string=PASSWORD("123456")  
WHERE User = "username" AND Host = "hostname";
2.7、列出所有用户

要列出 MySQL 服务器的所有用户,您必须以管理员身份登录 MySQL 数据库服务器。在 mysql 客户端中,我们可以按照如下操作:

代码语言:javascript
复制
mysql -u root -p

输入 root 帐户的密码并按 Enter :

代码语言:javascript
复制
Enter password: ********

使用下面的 SELECT 语句 从 mysql 数据库中的 user 表中查询所有的用户:

代码语言:javascript
复制
SELECT user, host FROM mysql.user;
2.8、用户授权

当您创建了一个新用户之后,这个新的用户可以登录 MySQL 数据库服务器,但是他可能没有任何权限。只有在赋予他数据库和相关表的权限之后,他才可以进行选择数据库和查询等操作。

在 MySQL 中, GRANT 语句用于给用户赋予权限。

下面是 MySQL GRANT 的语法:

代码语言:javascript
复制
GRANT privilege_type [,privilege_type],..
ON privilege_object
TO user_account;

在这个语法中:

  • privilege_type 权限类型。要赋予给用户的权限。 常用的包括: ALL, SELECT, UPDATE, DELETE, ALTER, DROP 以及 INSERT 等。 更详细的内容请参考:https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_all
  • privilege_object 权限对象。可以是所有对象,也可以是某个数据库中的所有对象,表 等。常用的包括: *, *.*, db_name.*, db_name.table_name, table_name 等。
  • user_account 用户账户。 它使用 username@host 的形式。
2.9、显示权限

MySQL 允许您使用 SHOW GRANTS 语句来显示分配给用户帐户或角色的权限。

以下是 SHOW GRANTS 语句的基本语法:

代码语言:javascript
复制
SHOW GRANTS
[FOR {user | role}
[USING role [, role] ...]]

在这个语法中:

  • 首先,在 FOR 关键字后指定要显示先前授予用户帐户或角色的权限的用户帐户或角色的名称。如果跳过 FOR 子句,则 SHOW GRANTS 返回当前用户的权限。
  • 其次,使用 USING 子句检查与用户角色相关的权限。您在 USING 子句中指定的角色必须事先授予用户。

除了可以显示当前用户的权限和角色,要执行 SHOW GRANTS 的语句,你需要有 mysql 系统数据库的 SELECT 权限。

2.10、撤销权限

下面说明了 REVOKE 撤销用户帐户的一项或多项权限的语句的基本语法:

代码语言:javascript
复制
REVOKE
   priv1 [, priv2 [, ...] ]
ON [object_type] privilege_level
FROM user1 [, user2 [, ...]];

在这个语法中:

  • 在 REVOKE 关键字后指定要从用户帐户中撤销的以逗号分隔的权限列表。
  • 在 ON 关键字后指定权限的对象类型和权限级别;查看 GRANT 语句以获取有关权限级别的更多信息。
  • 在 FROM 子句中指定一个或多个您要撤销其权限的用户帐户。

请注意,要执行这种形式的 REVOKE 语句,您必须具有 GRANT OPTION 权限或必须具有您要撤销的权限。


3、MySQL 提供了哪些权限

MySQL 提供的权限列表如下所示(其中,All 或者 All privileges 代表权限列表中除 Grant option 权限之外的所有权限)。

代码语言:javascript
复制
mysql> show privileges;
+----------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege                  | Context                               | Comment                                               |
+----------------------------+---------------------------------------+-------------------------------------------------------+
| Alter                      | Tables                                | To alter the table                                    |
| Alter routine              | Functions,Procedures                  | To alter or drop stored functions/procedures          |
| Create                     | Databases,Tables,Indexes              | To create new databases and tables                    |
| Create routine             | Databases                             | To use CREATE FUNCTION/PROCEDURE                      |
| Create role                | Server Admin                          | To create new roles                                   |
| Create temporary tables    | Databases                             | To use CREATE TEMPORARY TABLE                         |
| Create view                | Tables                                | To create new views                                   |
| Create user                | Server Admin                          | To create new users                                   |
| Delete                     | Tables                                | To delete existing rows                               |
| Drop                       | Databases,Tables                      | To drop databases, tables, and views                  |
| Drop role                  | Server Admin                          | To drop roles                                         |
| Event                      | Server Admin                          | To create, alter, drop and execute events             |
| Execute                    | Functions,Procedures                  | To execute stored routines                            |
| File                       | File access on server                 | To read and write files on the server                 |
| Grant option               | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess   |
| Index                      | Tables                                | To create or drop indexes                             |
| Insert                     | Tables                                | To insert data into tables                            |
| Lock tables                | Databases                             | To use LOCK TABLES (together with SELECT privilege)   |
| Process                    | Server Admin                          | To view the plain text of currently executing queries |
| Proxy                      | Server Admin                          | To make proxy user possible                           |
| References                 | Databases,Tables                      | To have references on tables                          |
| Reload                     | Server Admin                          | To reload or refresh tables, logs and privileges      |
| Replication client         | Server Admin                          | To ask where the slave or master servers are          |
| Replication slave          | Server Admin                          | To read binary log events from the master             |
| Select                     | Tables                                | To retrieve rows from table                           |
| Show databases             | Server Admin                          | To see all databases with SHOW DATABASES              |
| Show view                  | Tables                                | To see views with SHOW CREATE VIEW                    |
| Shutdown                   | Server Admin                          | To shut down the server                               |
| Super                      | Server Admin                          | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.   |
| Trigger                    | Tables                                | To use triggers                                       |
| Create tablespace          | Server Admin                          | To create/alter/drop tablespaces                      |
| Update                     | Tables                                | To update existing rows                               |
| Usage                      | Server Admin                          | No privileges - allow connect only                    |
| FLUSH_TABLES               | Server Admin                          |                                                       |
| FLUSH_OPTIMIZER_COSTS      | Server Admin                          |                                                       |
| INNODB_REDO_LOG_ENABLE     | Server Admin                          |                                                       |
| APPLICATION_PASSWORD_ADMIN | Server Admin                          |                                                       |
| REPLICATION_APPLIER        | Server Admin                          |                                                       |
| AUDIT_ADMIN                | Server Admin                          |                                                       |
| TABLE_ENCRYPTION_ADMIN     | Server Admin                          |                                                       |
| SERVICE_CONNECTION_ADMIN   | Server Admin                          |                                                       |
| SESSION_VARIABLES_ADMIN    | Server Admin                          |                                                       |
| FLUSH_USER_RESOURCES       | Server Admin                          |                                                       |
| REPLICATION_SLAVE_ADMIN    | Server Admin                          |                                                       |
| CLONE_ADMIN                | Server Admin                          |                                                       |
| CONNECTION_ADMIN           | Server Admin                          |                                                       |
| SYSTEM_USER                | Server Admin                          |                                                       |
| ENCRYPTION_KEY_ADMIN       | Server Admin                          |                                                       |
| RESOURCE_GROUP_ADMIN       | Server Admin                          |                                                       |
| SHOW_ROUTINE               | Server Admin                          |                                                       |
| XA_RECOVER_ADMIN           | Server Admin                          |                                                       |
| PERSIST_RO_VARIABLES_ADMIN | Server Admin                          |                                                       |
| BINLOG_ADMIN               | Server Admin                          |                                                       |
| BINLOG_ENCRYPTION_ADMIN    | Server Admin                          |                                                       |
| BACKUP_ADMIN               | Server Admin                          |                                                       |
| GROUP_REPLICATION_ADMIN    | Server Admin                          |                                                       |
| SYSTEM_VARIABLES_ADMIN     | Server Admin                          |                                                       |
| SET_USER_ID                | Server Admin                          |                                                       |
| ROLE_ADMIN                 | Server Admin                          |                                                       |
| RESOURCE_GROUP_USER        | Server Admin                          |                                                       |
| FLUSH_STATUS               | Server Admin                          |                                                       |
| INNODB_REDO_LOG_ARCHIVE    | Server Admin                          |                                                       |
+----------------------------+---------------------------------------+-------------------------------------------------------+
62 rows in set (0.00 sec)
4.1、根据Context字段内容划分权限

在上表所示的权限列表中,Context 字段显示了该权限的使用环境(或者叫权限的作用域)。根据 Context 字段内容的不同,权限分为如下三类。

管理权限:用于管理 MySQL 服务器的操作。这些权限是全局性的,授权范围不能是特定的数据库或数据库对象(只能使用 *.* 方式授予,不能使用 db.* 或 db.tb 方式)

代码语言:javascript
复制
|Create user|Event|Process|Proxy|Reload|Replication client|Replication slave|Show databases|Shutdown|Super|Create tablespace|Usage|Grant option|

数据库级别权限:授权范围可以是某数据库或某数据库中的所有对象,也可以是所有数据库(可以使用 *.* 代表全局对象;也可以使用 db.* 代表某库下的所有对象)

代码语言:javascript
复制
|Create|Create routine|Create temporary tables|Drop|Lock tables|References|

数据库对象级别权限:授权范围可以为数据库中的特定对象、数据库内给定类型的对象,也可以是所有数据库(*.* 代表全局对象,db.* 代表某库下的所有对象,db.tb 代表某库下的某对象)。

代码语言:javascript
复制
|Alter|Alter routine|Create view|Delete|Execute|Fil|Indexe|Insert|Select|Show view|Trigger|Update
4.2、按照经验划分

此外,通常还可以根据使用经验按照如下方式划分

开发权限:

代码语言:javascript
复制
|Delete|Insert|Select|Update|Alter|Create temporary tables|Trigger|Create view|Show view|Alter routine|Create routine|Execute|Index|Event|

管理权限——表级别(这里把带表级别的管理命令都归类为表级别):

代码语言:javascript
复制
|Create|File|Drop|Lock tables

管理权限——服务器级别

代码语言:javascript
复制
|Grant option|Create tablespace|Create user|Process|Proxy|Reload|Replication client|Replication slave|Show databases|Shutdown|Super|Usage|
4.3、具体权限作用介绍
  • All 或 All privileges:除 Grant option 之外,代表其他所有权限。
  • Alter:该权限用于使用 ALTER TABLE 语句来更改表的结构(除该权限之外,使用 ALTER TABLE 语句还需要有 Create 和 Insert 权限,使用 ALTER TABLE RENAME 语句需要有旧表上的 Alter 和 Drop 权限,新表上的 Create 和 Insert权限)。
  • Alter routine:该权限用于修改或删除存储过程或存储函数。
  • Create:该权限用于创建库和表。
  • Create routine:该权限用于创建存储过程或存储函数。
  • Create tablespace:该权限用于创建、修改、删除表空间文件和日志组文件。
  • Create temporary tables:该权限用于创建临时表。使用 CREATE TEMPORARY TABLE 语句创建临时表,一旦某会话创建临时表成功后,服务器不会在该表上执行权限检查(因为其他会话看不见此表,创建此表的会话一旦断开,临时表就会自动删除)。即,创建临时表的会话可以对该临时表执行任何操作,例如 DROP TABLE、INSERT、 UPDATE、SELECT 等操作。
  • Create user:该权限用于使用 ALTER USER、CREATE USER、DROP USER、RENAME USER、REVOKE ALL PRIVILEGES 语句。
  • Create view:该权限用于使用 CREATE VIEW 语句。
  • Delete:该权限用于从数据库表中删除数据记录。
  • Drop:该权限用于删除现有库、表、视图等对象。另外,如果在分区表上使用 ALTER TABLE … DROP PARTITION 语句,则必须要有表的 Drop 权限,执行 TRUNCATETABLE 也需要有 Drop 权限(但要注意,如果将 MySQL 数据库的 Drop 权限授予用户,则该用户可以删除存储 MySQL 访问权限记录的数据库 mysql)。
  • Event:该权限用于创建、更改、删除或查看 Event Scheduler事件。
  • Execute:该权限用于执行存储过程或存储函数。
  • File:该权限用于执行 LOAD DATA INFILE 和 SELECT … INTO OUTFILE 语句以及 LOAD_FILE() 函数来读写服务器主机上的文件。具有 File 权限的用户可以读取服务器主机上的任何可读文件或 MySQL 服务器可读文件。(即,用户可读取 datadir 目录中的任何文件),File 权限还使用户能够在 MySQL 服务器有写入权限的任何目录下创建新文件。所以,作为安全保护措施,服务器不会覆盖现有文件(即,在执行导出数据到文本时,如果文件名重复,则导出语句无法成功执行)。在 MySQL 5.7 版本中,可以使用 secure_file_priv 系统变量限制 File 权限的读写目录。
  • Grant option:该权限用于授予或回收其他用户或自己拥有的权限。
  • Index:该权限用于创建或删除索引。Index 权限适用于在已存在的表上使用 CREATE INDEX 语句,如果用户具有 Create 权限,则可以在 CREATE TABLE 语句中包含 索引定义语句。
  • Insert:该权限用于向表中插入数据记录行。对于 ANALYZE TABLE、OPTIMIZE TABLE 和 REPAIR TABLE 表维护语句也需要 Insert 权限。
  • Lock tables:该权限用于使用 LOCK TABLES 语句对表显式加锁,持有表锁的用户对该表有读写权限,未持有表锁的用户对该表的读写访问会被阻塞。
  • Process:该权限用于显示有关在服务器上执行的线程信息(即,关于会话正在执行的语句相关状态信息)。拥有该权限的用户在使用 SHOW PROCESSLIST 语句或 mysqladmin processlist 命令查看有关线程信息时,除可以看到自己的线程信息之外还可以查看到属于其他账号的线程信息。另外,使用 SHOW ENGINE 语句以及查看 information_schema 系统库中的相当一部分表也需要该权限。
  • Proxy:该权限使用户能够模仿(伪装、代理)另一个用户。
  • References:在创建外键约束时,该权限需要用户具有父表的 References 权限。
  • Reload:该权限允许用户使用 FLUSH 语句。拥有该权限的用户还可以使用与 FLUSH 操作等效的 mysqladmin 子命令 flush-hosts、flush-logs、flush-privileges、flushstatus、flush-tables、flush-threads、refresh 和 reload。其中,reload 子命令会通知服务器将权限表重新加载到内存中;flush-privileges 子命令的作用与 reload 相同;refresh子命令会通知服务器关闭并重新打开日志文件且刷新所有表。其他 flush-xxx 子命令也会执行类似于刷新的功能,这些子命令刷新的对象更具体。例如,只想刷新日志文件,则使用 flush-logs 子命令。
  • Replication client:该权限用于使用 SHOW MASTER STATUS、SHOW SLAVE STATUS和SHOW BINARY LOGS 语句。
  • Replication slave:该权限用于从从库服务器连接到主库服务器并请求主库的 binlog 日志。如果没有此权限,从库将无法请求主库数据库变更的 binlog 日志。
  • Select:该权限用于从数据库表中查询数据行记录。使用 SELECT 语句只有实际从表中检索行记录时才需要 Select 权限。但某些 SELECT 语句不需要访问表,并且可以在没有任何数据库权限的情况下执行。例如,使用 SELECT 语句拼接的常量表达式:SELECT 1 + 1; SELECT PI()* 2;。另外,使用 UPDATE 或 DELETE 语句,当使用 WHERE 子句指定了某字段的条件值时,也需要该字段的 SELECT 权限;否则,你会发现可以使用 UPDATE 不带 WHERE 子句更新全表,却不能使用 WHERE 语句指定更新某些行记录。对基表或视图使用 EXPLAIN 语句,也需要用户对表或视图具有该权限。
  • Show databases:该权限用于执行 SHOW DATABASE 语句,对于没有此权限的用户,则只能看到其具有对应访问权限的数据库列表。如果服务器使用了 –skip-show database 选项启动,则没有该权限的用户即使对某库有其他访问权限,也不能使用 SHOW DATABASES 语句查看任何数据库列表(会报错:ERROR 1227 (42000): Access denied; you need (at least one of) the SHOW DATABASES privilege(s) for this operation)。
  • `Show view:该权限用于执行SHOW CREATE VIEW语句。对视图使用EXPLAIN语句也需要此权限。
  • Shutdown:该权限用于执行 SHUTDOWN 语句、mysqladmin shutdown 命令和 mysql_shutdown() C API 函数。
  • Super:该权限用于进行如下操作和服务器行为:
    • 修改全局系统配置变量需要此权限。对于某些系统变量,修改会话级别的系统配置变量也需要 Super 权限(如果修改会话级别的系统配置变量需要 Super 权限,在变量的解释文档中会进行说明,例如 binlog_format、sql_log_bin 和 sql_log_off);
    • 对全局事务特征的更改(START TRANSACTION 语句);
    • 从库服务器用于执行启动和停止复制的语句,包括组复制;
    • 从库服务器用于执行 CHANGE MASTER TO 和 CHANGE REPLICATION FILTER 语句;
    • 执行 PURGE BINARY LOGS 和 BINLOG 语句;
    • 如果视图或存储程序定义了 DEFINER 属性,则拥有 Super 权限的用户就算不是该视图或存储程序的创建者,也仍然可以执行该视图或存储程序;
    • 执行 CREATE SERVER、ALTER SERVER 和 DROP SERVER 语句;
    • 执行 mysqladmin debug 命令;
    • 用于 InnoDB key 自旋;
    • 通过执行 DES_ENCRYPT() 函数启用读取 DES 密钥文件;
    • 执行用户自定义函数时启用版本令牌;
    • 超过了最大连接数之后,具有 Super 权限的账户还可以执行的操作有:
      • 使用 KILL 语句或 mysqladmin kill 命令来终止属于其他账户的线程(注意:无论是否拥有 Super 权限,用户总是可以 kill 自己的线程);
      • 即使服务器总连接数达到 max_connections 系统变量定义的值,服务器也会接受来自具 Super 权限的用户的一个额外连接。
      • 即使服务器启用了 read_only 系统变量,具有 Super 权限的用户也仍然可以执行数据更新,包括显式的操作更新和隐式的操作更新(账户管理语句 GRANT 和 REVOKE 等触发的表更新)。
      • 具有 Super 权限的用户连接服务器时,服务器不执行 init_connect 系统变量指定的内容。
      • 处于脱机模式(已启用 offline_mode 系统变量)的服务器不会中断具有 Super 权限的用户的连接,且仍然接受具有 Super 权限的用户的新连接请求。
    • 如果启用了二进制日志记录功能,则用户可能还需要 Super 权限才能创建或更改存储的功能。
  • Trigger:该权限用于触发器的操作。用户必须拥有某表的该权限才能针对该表创建、删除、执行或查看其触发器。
  • Update:该权限用于执行对数据库表中的数据行更新操作。
  • Usage:该权限代表用户“无任何权限”。全局级别权限,拥有该权限的用户可以登录到数据库服务器中,但在默认配置下除能够执行部分show命令之外,其他任何数据变更和数据库查询操作都无法执行。

Ps:只向用户授予其需要的权限,不要授予额外的多余的权限,特别是管理权限,例如 File、Grantoption、Alter、Shutdown、Process、Super 等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1、MySQL 中的 DCL 语句
    • 1.1、数据控制语言–DCL
    • 1.2、MySQL 权限概述
  • 2、MySQL 中库表的 DQL 语句详解
    • 2.1、MySQL 服务器登录
    • 2.2、创建用户
    • 2.3、修改用户
    • 2.4、删除用户
    • 2.5、设置当前用户密码
    • 2.6、修改其他用户密码
    • 2.7、列出所有用户
    • 2.8、用户授权
    • 2.9、显示权限
    • 2.10、撤销权限
  • 3、MySQL 提供了哪些权限
    • 4.1、根据Context字段内容划分权限
    • 4.2、按照经验划分
    • 4.3、具体权限作用介绍
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档