mysql中不同权限类型(SELECT、INSERT、UPDATE等)的含义与应用

来源:这里教程网 时间:2026-02-28 20:44:38 作者:

SELECT、INSERT、UPDATE、DELETE 这四个权限到底控制什么

它们分别对应 SQL 的基础数据操作动词,不是“能连上数据库”或“能看到表名”,而是精确到「对哪些对象执行哪类语句」的开关。MySQL 用

GRANT
分配时,必须明确指定数据库名和表名(或通配符),否则权限不生效。

SELECT
:允许执行
SELECT
查询,包括
SELECT ... INTO OUTFILE
(但导出路径受
secure_file_priv
限制)
INSERT
:允许
INSERT
、
LOAD DATA INFILE
(同样受
secure_file_priv
约束),但不包含
REPLACE
(需额外
DELETE
权限)
UPDATE
:只允许修改已有行,不影响新增或删除;字段级权限可细化到具体列,如
GRANT UPDATE(col_a) ON db.t1
DELETE
:仅控制
DELETE FROM
,不包含
TRUNCATE TABLE
(后者需要
DROP
权限)

ALTER、DROP、CREATE 这类 DDL 权限容易被误用

它们不涉及数据内容,而是影响表结构与对象存在性,权限粒度比 DML 更粗,且常被当成“开发账号标配”乱开,带来高风险。

ALTER
允许
ALTER TABLE
、
RENAME TABLE
、
ANALYZE TABLE
,但不能改库名(需
ALTER ROUTINE
配合)
DROP
对数据库级生效时会删整个库,对表级生效时可删表——哪怕只有这一个权限,也能清空业务表
CREATE
在数据库级表示能建新表,在表级无意义;若授予
CREATE
+
INSERT
,应用可能意外建临时表并写入敏感数据
注意:
INDEX
权限独立存在,
CREATE
不自动包含它;加索引需显式授权

USAGE 权限不是“最低权限”,而是“零权限”

新建用户不授任何权限时,默认拥有

USAGE
,它只表示「账号存在且可通过认证」,连
SHOW DATABASES
都看不到(除非开启
skip-show-databases
或有全局
SELECT
)。

GRANT USAGE ON *.* TO 'app_user'@'10.0.1.%';

这种写法等价于创建账号但不给任何操作权。线上常见错误是以为

USAGE
能配合
WITH GRANT OPTION
做权限代理——不行,
GRANT OPTION
必须搭配至少一个实际权限(如
SELECT
)才有效。

如何验证某用户实际拥有的权限

别依赖记忆或文档,直接查

mysql.tables_priv
和
mysql.db
表,或用内置命令。注意:结果反映的是当前生效权限,不含未
FLUSH PRIVILEGES
的变更。

SHOW GRANTS FOR 'app_user'@'10.0.1.%';

如果返回空或只有

USAGE
,说明没生效;若看到类似
GRANT SELECT, INSERT ON `myapp`.* TO ...
,确认库名、主机段是否匹配当前连接来源。特别留意通配符:
`myapp`.*
不等于
`myapp\_%`.*
,前者只覆盖字面名为
myapp
的库。

字段级权限不会出现在

SHOW GRANTS
中,得查
mysql.columns_priv
表,生产环境极少需要,一开就难审计。

相关推荐