数据控制语言
数据控制语言 (data control language) 是用来设置或更改数据库用户或角色权限的语句.
| 层级 | 描述 |
|---|---|
| 全局层级 | 适用于一个给定服务器中的所有数据库. 这些权限存储在 mysql.user 表中 |
| 数据库层级 | 适用于一个给定数据库中的所有目标. 这些权限存储在 mysql.db 和 mysql.host 表中 |
| 表层级 | 适用于一个给定表中所有的列. 这些权限存储在 mysql.tables_priv 表中 |
| 列层级 | 使用于一个给定表中的单一列. 这些权限存储在 mysql.columns_priv 表中 |
| 子程序层级 | CREATE ROUTINE, ALTER ROUTINE, EXECUTE 和 GRANT 权限适用于已存储的子程序. 这些权限可以被授予为全局层级和数据库层级 |
MySQL 权限体系
MySQL 的权限信息主要存储在以下几张表中, 当用户连接数据库时, MySQL 会根据这些表对用户进行权限验证.
| 表名 | 描述 |
|---|---|
| user | 用户权限表, 记录账号, 密码及全局性权限信息 |
| db | 记录数据库相关权限 |
| table_priv | 用户对某个表拥有的权限 |
| column_priv | 用户对某表某个列所拥有的权限 |
| procs_priv | 用户对存储过程及存储函数的操作权限 |
用户管理
在 MySQL 中, 使用 CREATE USER 来创建用户, 用户创建后没有任何权限.
查看所有用户:

立即学习“PHP免费学习笔记(深入)”;
创建用户
MySQL 的用户账号由两部分组成: 用户名和主机名, 即用户名@主机名,主机名可以是 IP 或机器名称, 主机名为
%表示允许任何地方的主机远程登录 MySQL 数据库.
格式:
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin","mysql");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "CREATE USER 'user1'@'%'
IDENTIFIED BY '123456'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 关闭连接
mysqli_close($conn);
?>效果:

删除用户
格式:
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin","mysql");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "DROP USER 'user1'@'%'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 关闭连接
mysqli_close($conn);
?>修改密码
格式:
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin","mysql");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "ALTER USER 'root'@'localhost'
IDENTIFIED BY '123456'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 关闭连接
mysqli_close($conn);
?>权限管理
MySQL 使用
GRANT和
REVOKE进行授权, 撤销授权. 权限具体分为 3 类, 数据类, 结构类, 和管理类.
| 数据 | 结构 | 管理 |
|---|---|---|
| SELECT INSERT UPDATE DELETE FILE |
CREATE ALTER INDEX DROP CREATE TEMPORARY TABLES SHOW VIEW CREATE ROUTINE ALTER ROUTINE EXECUTE CREATE VIEW EVENT TRIGGER |
USAGE GRANT SUPER PROCESS RELOAD SHUTDOWN SHOW DATABASES LOCK TABLES REFERENCES REPUCATION CUENT REPUCATION SLAVE CREATE USER |
查看权限
格式:
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "SHOW GRANTS FOR 'root'@'localhost'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 调试输出
while ($line = mysqli_fetch_assoc($result)) {
print_r($line);
}
# 关闭连接
mysqli_close($conn);
?>输出结果:
用户授权
格式:
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "GRANT ALL PRIVILEGES ON study.table1 TO 'user1'@'%'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 关闭连接
mysqli_close($conn);
?>撤销授权
例子:
<?php
$conn = mysqli_connect("localhost", "root","admin");
if ($conn) {
echo "数据库连接成功\n";
} else {
echo mysqli_connect_error();
}
# SQL语句
$SQL = "REVOKE ALL PRIVILEGES ON study.table1 FROM 'user1'@'%'";
# 执行
$result = mysqli_query($conn, $SQL);
# 查看是否执行成功
if ($result) {
echo "SQL 语句执行成功!\n";
}else {
echo mysqli_error($conn);
}
# 关闭连接
mysqli_close($conn);
?>刷新权限
格式:
注意事项
禁止 root 远程登录.
禁止 root 远程登录的原因:
root 是 MySQL 数据库的超级管理员. 几乎拥有所有权限, 一旦泄露后果非常严重
root 是 MySQL 数据库的默认用户. 如果不禁止远程登录, 则某些人可以针对 root 用户暴力破解密码
