在MySQL中如何限制用户对特定表的修改权限?

老雪吖_4044

老雪吖_4044

2026-07-13

802人浏览

原创

只授select权限、不授update/delete是最直接的表级只读控制方式;需显式授予select,确保未授予任何写权限,且revoke须严格匹配原授权四元组,否则静默失败。

在mysql中如何限制用户对特定表的修改权限?

只授SELECT,不授UPDATE/DELETE是最直接的控制方式

MySQL 表级权限默认是“全无”,没显式授予就什么也干不了。想让某用户只能查不能改,核心就是只执行 GRANT SELECT ON db_name.table_name TO 'user'@'host',其他权限一个不给。

常见错误是顺手写了 GRANT ALL PRIVILEGES 或漏掉 UPDATE、DELETE 的显式拒绝——MySQL 没有“拒绝”语法,只有“授予”和“未授予”。只要没授,就天然禁止。

  • 新建用户后,立刻检查:用 SHOW GRANTS FOR 'user'@'host' 确认输出里没有 UPDATE、DELETE、ALL PRIVILEGES
  • 如果已有用户误授过,必须用 REVOKE UPDATE, DELETE ON db_name.table_name FROM 'user'@'host' 精准回收,不能只靠“不授新权限”
  • 注意:INSERT 是独立权限,不授就不会插入;但 SELECT + INSERT 组合常被当成“只读”误解,其实它允许新增数据

REVOKE 失效?检查作用域是否完全匹配

执行 REVOKE UPDATE ON sales_db.orders FROM 'reporter'@'10.20.%' 却发现还能 UPDATE,大概率是四元组(库名、表名、用户名、host)没对齐。

MySQL 的 REVOKE 是精确匹配机制,任何一处差异都会导致静默失败:大小写不一致、少反引号、host 写成 '%' 而实际是 '10.20.15.8'、库名多空格或少下划线——全都不报错,但权限纹丝不动。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 先用 SHOW GRANTS FOR 'user'@'host' 看原始授权语句,复制粘贴改 GRANT 为 REVOKE 最保险
  • 别信“我刚 revoke 了”,一定要再 SHOW GRANTS 确认输出里那条权限真的没了
  • 旧连接不会自动更新权限,KILL 对应线程或让应用重连才生效

字段级禁止修改?原生不支持,得绕道

MySQL 没有 UPDATE (col_a) 这种列级写权限。想让 amount 字段不可改,但允许改 status,不能靠 GRANT 解决。

可行方案只有两个,且各有硬伤:

  • 建视图:CREATE VIEW orders_ro AS SELECT id, status, created_at FROM orders,再授 UPDATE 权限给视图,并加 WITH CHECK OPTION。但所有写操作必须走视图,直连基表就失效
  • 用触发器拦截:BEFORE UPDATE ON orders 里判断 IF OLD.amount != NEW.amount THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'amount is read-only'; END IF;。但触发器无法阻止 UPDATE ... SET @var := amount 这类间接读取,且批量更新时性能明显下降

权限生效后仍报错?先看连接上下文和缓存

执行完 GRANT 或 REVOKE 后,用户连上来还是报 ERROR 1142 (42000): UPDATE command denied 或反而能操作,问题往往不在语句本身。

  • 确认客户端连接用的是目标账号:SELECT USER(), CURRENT_USER(); —— 前者是登录身份,后者才是权限匹配依据,两者可能不同
  • 检查 host 是否精确匹配:'appuser'@'localhost' 和 'appuser'@'127.0.0.1' 是两个用户,DNS 反查开启时还可能因域名解析延迟错配
  • MySQL 8.0+ 使用 mysql_native_password 插件时,某些连接池会缓存认证态,重连也不刷新权限,需重启应用或清空连接池

真正卡住人的从来不是语法对不对,而是你改的是 'user'@'10.20.%',而应用连的是 'user'@'10.20.30.5'——差一个点,权限就完全不生效。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2073

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2792

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4648

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4911

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4382

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5714

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习