6.2.2 MySQL 提供的特权

授予 MySQL 帐户的特权确定该帐户可以执行的操作。 MySQL 特权在它们适用的上下文和不同的操作级别中有所不同:

有关帐户特权的信息存储在mysql系统数据库的授权 table 中。有关这些 table 的结构和内容的描述,请参见第 6.2.3 节“授权 table”。 MySQL 服务器启动时将授权 table 的内容读取到内存中,并在第 6.2.9 节“特权更改何时生效”所示的情况下重新加载它们。服务器根据授予 table 的内存副本进行访问控制决策。

Important

一些 MySQL 版本对授予 table 进行了更改,以添加新的特权或功能。为了确保您可以利用所有新功能,每当升级 MySQL 时,将授权 table 更新为当前结构。参见第 2.11 节“升级 MySQL”

以下各节概述了可用的特权,提供了每个特权的更详细说明,并提供了使用准则。

可用权限摘要

下 table 显示了GRANTREVOKE语句中使用的特权名称,以及与授予 table 中每个特权关联的列名以及该特权所应用的上下文。

table6.2 GRANT 和 REVOKE 的允许特权

Privilege 赠款 table 列 Context
ALL [PRIVILEGES] “所有特权”的同义词 Server administration
ALTER Alter_priv Tables
ALTER ROUTINE Alter_routine_priv Stored routines
CREATE Create_priv 数据库,table 或索引
CREATE ROUTINE Create_routine_priv Stored routines
CREATE TABLESPACE Create_tablespace_priv Server administration
创建临时 table Create_tmp_table_priv Tables
CREATE USER Create_user_priv Server administration
CREATE VIEW Create_view_priv Views
DELETE Delete_priv Tables
DROP Drop_priv 数据库,table 或视图
EVENT Event_priv Databases
EXECUTE Execute_priv Stored routines
FILE File_priv 服务器主机上的文件访问
GRANT OPTION Grant_priv 数据库,table 或存储的例程
INDEX Index_priv Tables
INSERT Insert_priv table 或列
LOCK TABLES Lock_tables_priv Databases
PROCESS Process_priv Server administration
PROXY proxies_privtable Server administration
REFERENCES References_priv 数据库或 table
RELOAD Reload_priv Server administration
REPLICATION CLIENT Repl_client_priv Server administration
REPLICATION SLAVE Repl_slave_priv Server administration
SELECT Select_priv table 或列
SHOW DATABASES Show_db_priv Server administration
SHOW VIEW Show_view_priv Views
SHUTDOWN Shutdown_priv Server administration
SUPER Super_priv Server administration
TRIGGER Trigger_priv Tables
UPDATE Update_priv table 或列
USAGE “没有特权”的同义词 Server administration

Privilege Descriptions

以下列 table 提供了 MySQL 中可用的每个特权的一般说明。特定的 SQL 语句可能具有比此处指示的更具体的特权要求。如果是这样,则有关语句的描述将提供详细信息。

这些特权说明符是“在给定特权级别可用的所有特权”(GRANT OPTION除外)的简写。例如,在全局或 table 级别授予ALL分别授予所有全局特权或所有 table 级别特权。

启用使用ALTER TABLE语句来更改 table 的结构。 ALTER TABLE还需要CREATEINSERT特权。重命名 table 需要在旧 table 上使用ALTERDROP,在新 table 上使用CREATEINSERT

支持使用更改或删除存储例程(存储过程和函数)的语句。

允许使用创建新数据库和 table 的语句。

允许使用创建存储例程(存储过程和函数)的语句。

启用对创建,更改或删除 table 空间和日志文件组的语句的使用。

启用使用创建临时 table语句创建临时 table。

会话创建临时 table 后,服务器将不再对该 table 执行任何特权检查。创建会话可以对 table 执行任何操作,例如DROP TABLEINSERTUPDATESELECT。有关更多信息,请参见第 13.1.18.2 节“ CREATE TEMPORARY TABLE 语句”

启用对ALTER USERCREATE USERDROP USERRENAME USER撤销所有特权语句的使用。

启用使用CREATE VIEW语句。

使行可以从数据库的 table 中删除。

支持使用删除(删除)现有数据库,table 和视图的语句。在分区 table 上使用ALTER TABLE ... DROP PARTITION语句需要DROP特权。 TRUNCATE TABLE也需要DROP特权。

支持使用为事件计划程序创建,更改,删除或显示事件的语句。

允许使用执行存储例程(存储过程和函数)的语句。

影响以下操作和服务器行为:

作为安全措施,服务器不会覆盖现有文件。

要限制文件的读写位置,请将secure_file_priv系统变量设置为特定目录。参见第 5.1.7 节“服务器系统变量”

使您可以授予自己拥有的特权或从其他用户撤消这些特权。

允许使用创建或删除(删除)索引的语句。 INDEX适用于现有 table。如果您具有 table 的CREATE特权,则可以在CREATE TABLE语句中包括索引定义。

允许将行插入数据库的 table 中。 ANALYZE TABLEOPTIMIZE TABLEREPAIR TABLEtable 维护语句也需要INSERT

允许使用显式的LOCK TABLES语句来锁定您具有SELECT特权的 table。这包括使用写锁,这可以防止其他会话读取锁定的 table。

PROCESS特权控制对服务器中正在执行的线程的信息(即,有关会话正在执行的语句的信息)的访问。可以通过以下方式访问使用SHOW PROCESSLIST语句,mysqladmin processlist命令和INFORMATION_SCHEMA.PROCESSLISTtable 可用的线程信息:

Note

Performance Schema threadstable 还提供线程信息,但 table 访问使用不同的特权模型。参见第 25.12.16.3 节“线程 table”

PROCESS特权还允许使用SHOW ENGINE语句,访问INFORMATION_SCHEMA InnoDBtable(名称以INNODB_开头的 table),以及(从 MySQL 5.7.31 开始)访问INFORMATION_SCHEMA FILEStable。

使一个用户可以模拟或成为另一用户。参见第 6.2.14 节“代理用户”

创建外键约束要求父 table 具有REFERENCES特权。

启用使用FLUSH语句。它还启用与FLUSH操作等效的mysqladmin命令:flush-hostsflush-logsflush-privilegesflush-statusflush-tablesflush-threadsrefreshreload

reload命令告诉服务器将授权 table 重新加载到内存中。 flush-privilegesreload的同义词。 refresh命令关闭并重新打开日志文件,并刷新所有 table。其他flush-xxx命令执行的功能类似于refresh,但更具体,在某些情况下可能更可取。例如,如果只想刷新日志文件,则flush-logsrefresh更好。

RELOAD特权还允许使用RESET MASTERRESET SLAVE语句。

启用对显示主状态显示从站状态显示二进制日志语句的使用。将此特权授予从属服务器用来作为主服务器连接到当前服务器的帐户。

使帐户能够使用显示从主机显示中继事件显示 BINLOG 事件语句请求对主服务器上的数据库进行的更新。使用mysqlbinlog选项--read-from-remote-server(-R)和--read-from-remote-master也是必需的。将此特权授予从属服务器用来作为主服务器连接到当前服务器的帐户。

允许从数据库的 table 中选择行。 SELECT语句仅在实际访问 table 时才需要SELECT特权。某些SELECT语句不访问 table,并且可以在未经任何数据库许可的情况下执行。例如,您可以使用SELECT作为简单的计算器来评估不引用 table 的 table 达式:

SELECT 1+1;
SELECT PI()*2;

其他读取列值的语句也需要SELECT特权。例如,对于UPDATE语句中* col_name * = * expr *赋值的右侧引用的列或DELETEUPDATE语句的WHERE子句中命名的列,需要SELECT

EXPLAIN一起使用的 table 或视图(包括视图定义中的所有基础 table)需要SELECT特权。

通过发出SHOW DATABASE语句使帐户能够查看数据库名称。没有此特权的帐户只能看到具有某些特权的数据库,并且如果服务器是使用--skip-show-database选项启动的,则根本不能使用该语句。

Caution

因为全局特权被视为所有数据库的特权,所以* any *全局特权使用户可以使用SHOW DATABASES或通过检查INFORMATION_SCHEMA SCHEMATAtable 来查看所有数据库名称。

启用使用显示创建视图语句。与EXPLAIN一起使用的视图也需要此特权。

启用SHUTDOWN语句,mysqladmin shutdown命令和mysql_shutdown() C API 函数的使用。

影响以下操作和服务器行为:

如果启用了二进制日志记录,则您可能还需要SUPER特权才能创建或更改存储的功能,如第 23.7 节“存储的程序二进制日志”中所述。

启用触发器操作。您必须具有此特权才能使 table 创建,删除,执行或显示该 table 的触发器。

激活触发器后(由有权执行与触发器关联的 table 的INSERTUPDATEDELETE语句的用户),触发器的执行要求定义触发器的用户仍对该 table 具有TRIGGER特权。

使行可以在数据库的 table 中更新。

该特权说明符代 table“无特权”。在GRANT全局级别使用它来修改帐户属性,例如资源限制或 SSLFeature,而无需在特权列 table 中命名特定的帐户特权。 SHOW GRANTS显示USAGEtable 示帐户在特权级别没有特权。

Privilege-Granting Guidelines

最好仅向帐户授予所需的特权。在授予FILE和 Management 特权时,应格外小心:

首页