权限
MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。
自主存取控制 DAC
(DiscretionaryAccess Control):用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权数据库安全性控制的权限授予别人。
SQL 中使用 GRANT
语句向用户授予对数据操作的权限,REVOKE
语句收回已经授予用户的权限。
权限的类型
MySQL的权限类型涵盖了用户对数据库和数据库对象可以执行的各种操作,包括但不限于以下几种:
-
SELECT:允许用户查询表中的数据。
-
INSERT:允许用户向表中插入新的数据行。
-
UPDATE:允许用户更新表中的数据。
-
DELETE:允许用户从表中删除数据。
-
CREATE:允许用户创建新的数据库、表、索引等对象。
-
DROP:允许用户删除数据库、表、索引等对象。
-
ALTER:允许用户修改表结构,如添加或删除列、修改列的数据类型等。
-
INDEX:允许用户创建或删除索引。
-
CREATE ROUTINE:允许用户创建存储过程或函数。
-
ALTER ROUTINE:允许用户修改或删除存储过程或函数。
-
EXECUTE:允许用户执行存储过程或函数。
-
GRANT OPTION:允许用户将自己拥有的权限授予其他用户。
-
SUPER:超级权限,允许用户执行一些高级管理任务,如关闭MySQL服务、更改全局变量等。
此外,还有如USAGE(连接权限,无实际操作权限)、FILE(对服务器主机上文件的访问权限)、PROCESS(查看服务器中所有会话的权限)、SHUTDOWN(关闭服务器的权限)等权限。
权限的级别
MySQL 的权限按其作用范围可分为不同的级别,这些级别从大到小依次为:
-
全局级别(Global Level)
-
权限控制整个MySQL服务器上的操作,对所有数据库、表和列都有效。
-
使用
*.*
来指定授权范围,例如GRANT ALL PRIVILEGES ON *.* TO 'user'@'host';
。 -
权限信息存储在
mysql.user
表中。
-
-
数据库级别(Database Level)
-
权限限制用户对指定数据库的操作,包括对该数据库中所有表和列的访问。
-
使用
database_name.*
来指定授权范围,例如GRANT SELECT, INSERT ON database_name.* TO 'user'@'host';
。 -
权限信息存储在
mysql.db
表中。
-
-
表级别(Table Level)
-
权限控制用户对具体表的操作,如查询、插入、更新和删除表中的记录。
-
使用
database_name.table_name
来指定授权范围,例如GRANT UPDATE ON database_name.table_name TO 'user'@'host';
。 -
权限信息存储在
mysql.tables_priv
表中。
-
-
列级别(Column Level)
-
权限控制用户对表中指定列的访问,这是MySQL权限系统中最细粒度的控制。
-
使用
database_name.table_name(column_name1, column_name2, ...)
来指定授权范围。 -
权限信息存储在
mysql.columns_priv
表中。
-
-
例行程序级别(Routine Level)
-
权限控制用户对存储过程和函数的访问,包括执行、修改和删除存储过程或函数。
-
使用
PROCEDURE
或FUNCTION
关键字以及具体的存储过程或函数名来指定授权范围。 -
权限信息存储在
mysql.procs_priv
表中。
-
通过合理设置不同级别的权限,数据库管理员可以确保数据库的安全性和数据的完整性,同时满足不同用户对数据库资源的访问需求。在实际应用中,建议遵循最小权限原则,即只授予用户完成其工作所需的最小权限集,以减少潜在的安全风险。
权限的管理
授权权限 GRANT
在 MySQL 中,使用 GRANT
语句 授予指定用户对指定操作对象的指定操作权限。可以根据需要为用户分配特定的权限。
执行 GRANT
语句需要具有相应权限的用户才能执行:
- DBA
- 数据库对象的创建者
- 已经拥有该权限的用户
语法如下:
GRANT