mysql权限类型有哪些_mysql权限分类详解

MySQL权限分为全局(.)、数据库(db_name.*)、表(db_name.tbl_name)、列(db_name.tbl_name.col_name)及子程序五级,逐层匹配生效,管理权限仅全局有效。

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_privmysql.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)只认全局层级。