MySQL权限按作用范围分为四类:全局、数据库、表、列,外加子程序(存储过程/函数)这一特殊层级。不同层级对应不同操作粒度,也决定了授权语法是否合法。
全局权限(*.*)
适用于整个MySQL实例,控制服务器级操作,比如重启、查看所有库、创建用户等。这类权限只能用*.*格式授予,不能限定到某个库或表。
常见权限:CREATE USER、RELOAD、SHUTDOWN、PROCESS、SUPER、SHOW DATABASES、GRANT OPTION 注意:授予DROP ON *.*等于允许删除mysql系统库,极危险 错误示例:GRANT CREATE USER ON test.* TO 'u1'@'%';→ 报错,该权限不支持库级授权
数据库权限(db_name.*)
作用于指定数据库内的所有对象(表、视图、存储过程等),权限存储在mysql.db表中。
常见权限:CREATE、DROP、ALTER、LOCK TABLES、REFERENCES、CREATE ROUTINE、EXECUTE 例如:GRANT SELECT, INSERT ON sales.* TO 'appuser'@'10.0.1.%';→ 允许对sales库所有表读写 CREATE ROUTINE必须配合ALTER ROUTINE才能修改已有存储过程
表与列权限(db_name.tbl_name / db_name.tbl_name.col_name)
精细化控制到单张表甚至某一列,适合敏感字段隔离场景,权限分别存于mysql.tables_priv和mysql.columns_priv表。
表级常见权限:SELECT、INSERT、UPDATE、DELETE、INDEX、TRIGGER、ALTER 列级仅支持SELECT、INSERT、UPDATE,且必须显式列出列名,如:GRANT UPDATE(salary) ON hr.employees TO 'hr_mgr'@'%';UPDATE某列时,若涉及自增或默认值逻辑,仍需对应表的INSERT/ALTER权限配合
子程序权限(routine_name)
专用于存储过程和函数,支持全局、库级、子程序三级授权,权限记录在mysql.procs_priv中。
关键权限:EXECUTE(调用)、ALTER ROUTINE(修改/删除)、CREATE ROUTINE(新建) EXECUTE可在库级授予(ON db_name.*),也可精确到单个过程(
ON PROCEDURE db_name.p1) 没有WITH GRANT OPTION时,被授权者无法将EXECUTE权限再转授他人
权限生效依赖内存加载,每次执行GRANT/REVOKE后建议运行
FLUSH PRIVILEGES;确保立即生效;实际权限检查是逐层匹配——先查全局,再查库、表、列,任一层满足即通过,但管理类权限(如RELOAD)只认全局层级。
