如何用SQL语句构建一个用户数据库的详细步骤?
- 内容介绍
- 文章标签
- 相关推荐
痛点一览:
- 创建数据库后忘记刷新权限导致新建或修改的权限无效。
- 在多使用者环境下容易出现“使用者不存在”或“权限不足”的错误。
-
对
GRANT/REVOKE语法不熟悉,导致授予过多或过少的权限。 -
缺少对
ALTER USER …SET ROLE ,其实,的使用经验,导致角色切换不顺畅。 - 未考虑数据安全性与约束,容易产生数据一致性问题。
- 在迁移或备份时没有提前规划好数据库结构和使用者映射关系,造成恢复困难。怎么说呢,
1️⃣ 准备工作:安装与登录
1.1 安装数据库程序
根据操作程序选择对应的安装包。完成后开启服务:
sudo service mysql start
# 或者
systemctl start mysqld
1.2 登录为管理员并确认权限
NoSQL 示例:
mysql -u root -p
-- 输入 root 密码后进入交互式终端
SHOW GRANTS FOR 'root'@'localhost';-- 确认拥有 CREATE、GRANT 等特权
2️⃣ 创建数据库:为所有后续操作奠定基础
"我想快速建立一个测试库,却不知道字符集怎么选?"
CREATE DATABASE UserDB
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 若需指定存储方法可添加 ENGINE=InnoDB 等参数
\c UserDB -- 切换到新建库上下文
SHOW CREATE DATABASE UserDB;\q -- 退出 MySQL 客户端
\c mysql -- 回到默认库继续接下来操作
\q -- 或保持连接进行后续步骤
\c UserDB -- 切回新库执行表和使用者相关命令
USE UserDB;其实,SHOW TABLES;-- 验证当前为空
\c mysql -- 切回默认库再执行 GRANT 操作时常见错误避免此步骤会失误!\c UserDB --
切回新库完成后续步骤!话说回来,\q -- 最终退出客户端。-- 上面三条 \c 命令是为了确保你处在正确的上下文中,不然 CREATE USER / GRANT 可能报错!/* 如果你在其他 RDBMS
请用相应的 CREATE DATABASE / USE 命令替代 */
CREATE DATABASE IF NOT EXISTS UserDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE UserDB,不过,SHOW TABLES;DROP DATABASE IF EXISTS TestDb;/* 示例删除不必要的旧库 */
SELECT @@character_set_database,@@collation_database;/* 验证字符集 */
SET NAMES utf8mb4;/* 对于 PHP/Java 等客户端,保证字符编码一致 */
SET foreign_key_checks = ON;/* 开启外键检查,有利于后期约束校验 */
DELIMITER //
CREATE PROCEDURE setup_userdb
BEGIN
/* --------------------------------------------------------------------- */
/* 步骤 A:创建主要业务表 */
/* --------------------------------------------------------------------- */
DROP TABLE IF EXISTS Users;老实说,/* 在实际项目中可以使用 BIGINT AUTO_INCREMENT 替代 INT,以防 ID 重叠 */
CREATE TABLE Users (
UserID BIGINT PRIMARY KEY AUTO_INCREMENT,Username VARCHAR NOT NULL UNIQUE。Password VARCHAR NOT NULL,Email VARCHAR,CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,UpdatedAt TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
);/* --------------------------------------------------------------------- */
/* 步骤 B:创建管理员账户 */
/* --------------------------------------------------------------------- */
DROP USER IF EXISTS 'admin'@'localhost';CREATE USER 'admin'@'localhost' IDENTIFIED BY 'StrongPassword123!',GRANT ALL PRIVILEGES ON `UserDB`.* TO 'admin'@'localhost';FLUSH PRIVILEGES;/* --------------------------------------------------------------------- */
/* 步骤 C:创建普通业务使用者 */
/* --------------------------------------------------------------------- */
DROP USER IF EXISTS 'john_doe'@'%';CREATE USER 'john_doe'@'%' IDENTIFIED BY 'P@ssw0rd!',说起来,/* 给业务表授予最小必要权限,例如 SELECT 和 INSERT,仅限自己可见 */
GRANT SELECT。INSERT ON `UserDB`.`Users` TO 'john_doe'@'%';/* --------------------------------------------------------------------- */
/* 步骤 D:角色演示 */
/* --------------------------------------------------------------------- */
// 如果使用的是 PostgreSQL 或 SQL Server,可参考如下语法;MySQL 自 v8 起也支持角色功能。话说回来,// CREATE ROLE reader;// GRANT SELECT ON `UserDB`.`Users` TO reader;按理说,// ALTER USER john_doe WITH ROLE reader;/* --------------------------------------------------------------------- */
/* 步骤 E:最终检查 */
/* --------------------------------------------------------------------- */
// 查询已授权列表确认无误:
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE LIKE '%admin%';END//
DELIMITER;话说回来,CALL setup_userdb;
/* 执行过程 */
-- 如果出现错误,请先检查:
-- ① 当前是否已切换到正确的 database;-- ② 是否具备相应 CREATE / GRANT 权限;-- ③ 是否已执行 FLUSH PRIVILEGES;-- ④ 是否有同名对象已存在需先 DROP。/* ------------------------------------------ */
/* 示例脚本结束。*/
/* ------------------------------------------ */
3️⃣ 使用者管理与授权细节
"我需要对不同角色授予不同访问级别,但忘记了如何撤销和重新分配?"
| 操作类型 | 示例语句 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 删除使用者 |
| |||||||||
| 撤销权限 |
| |||||||||
| 修改角色 |
| |||||||||
| 授予全部访问权限 |
| |||||||||
| 授予特定表单一字段访问 | `
`
|
痛点一览:
- 创建数据库后忘记刷新权限导致新建或修改的权限无效。
- 在多使用者环境下容易出现“使用者不存在”或“权限不足”的错误。
-
对
GRANT/REVOKE语法不熟悉,导致授予过多或过少的权限。 -
缺少对
ALTER USER …SET ROLE ,其实,的使用经验,导致角色切换不顺畅。 - 未考虑数据安全性与约束,容易产生数据一致性问题。
- 在迁移或备份时没有提前规划好数据库结构和使用者映射关系,造成恢复困难。怎么说呢,
1️⃣ 准备工作:安装与登录
1.1 安装数据库程序
根据操作程序选择对应的安装包。完成后开启服务:
sudo service mysql start
# 或者
systemctl start mysqld
1.2 登录为管理员并确认权限
NoSQL 示例:
mysql -u root -p
-- 输入 root 密码后进入交互式终端
SHOW GRANTS FOR 'root'@'localhost';-- 确认拥有 CREATE、GRANT 等特权
2️⃣ 创建数据库:为所有后续操作奠定基础
"我想快速建立一个测试库,却不知道字符集怎么选?"
CREATE DATABASE UserDB
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 若需指定存储方法可添加 ENGINE=InnoDB 等参数
\c UserDB -- 切换到新建库上下文
SHOW CREATE DATABASE UserDB;\q -- 退出 MySQL 客户端
\c mysql -- 回到默认库继续接下来操作
\q -- 或保持连接进行后续步骤
\c UserDB -- 切回新库执行表和使用者相关命令
USE UserDB;其实,SHOW TABLES;-- 验证当前为空
\c mysql -- 切回默认库再执行 GRANT 操作时常见错误避免此步骤会失误!\c UserDB --
切回新库完成后续步骤!话说回来,\q -- 最终退出客户端。-- 上面三条 \c 命令是为了确保你处在正确的上下文中,不然 CREATE USER / GRANT 可能报错!/* 如果你在其他 RDBMS
请用相应的 CREATE DATABASE / USE 命令替代 */
CREATE DATABASE IF NOT EXISTS UserDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE UserDB,不过,SHOW TABLES;DROP DATABASE IF EXISTS TestDb;/* 示例删除不必要的旧库 */
SELECT @@character_set_database,@@collation_database;/* 验证字符集 */
SET NAMES utf8mb4;/* 对于 PHP/Java 等客户端,保证字符编码一致 */
SET foreign_key_checks = ON;/* 开启外键检查,有利于后期约束校验 */
DELIMITER //
CREATE PROCEDURE setup_userdb
BEGIN
/* --------------------------------------------------------------------- */
/* 步骤 A:创建主要业务表 */
/* --------------------------------------------------------------------- */
DROP TABLE IF EXISTS Users;老实说,/* 在实际项目中可以使用 BIGINT AUTO_INCREMENT 替代 INT,以防 ID 重叠 */
CREATE TABLE Users (
UserID BIGINT PRIMARY KEY AUTO_INCREMENT,Username VARCHAR NOT NULL UNIQUE。Password VARCHAR NOT NULL,Email VARCHAR,CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,UpdatedAt TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
);/* --------------------------------------------------------------------- */
/* 步骤 B:创建管理员账户 */
/* --------------------------------------------------------------------- */
DROP USER IF EXISTS 'admin'@'localhost';CREATE USER 'admin'@'localhost' IDENTIFIED BY 'StrongPassword123!',GRANT ALL PRIVILEGES ON `UserDB`.* TO 'admin'@'localhost';FLUSH PRIVILEGES;/* --------------------------------------------------------------------- */
/* 步骤 C:创建普通业务使用者 */
/* --------------------------------------------------------------------- */
DROP USER IF EXISTS 'john_doe'@'%';CREATE USER 'john_doe'@'%' IDENTIFIED BY 'P@ssw0rd!',说起来,/* 给业务表授予最小必要权限,例如 SELECT 和 INSERT,仅限自己可见 */
GRANT SELECT。INSERT ON `UserDB`.`Users` TO 'john_doe'@'%';/* --------------------------------------------------------------------- */
/* 步骤 D:角色演示 */
/* --------------------------------------------------------------------- */
// 如果使用的是 PostgreSQL 或 SQL Server,可参考如下语法;MySQL 自 v8 起也支持角色功能。话说回来,// CREATE ROLE reader;// GRANT SELECT ON `UserDB`.`Users` TO reader;按理说,// ALTER USER john_doe WITH ROLE reader;/* --------------------------------------------------------------------- */
/* 步骤 E:最终检查 */
/* --------------------------------------------------------------------- */
// 查询已授权列表确认无误:
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE LIKE '%admin%';END//
DELIMITER;话说回来,CALL setup_userdb;
/* 执行过程 */
-- 如果出现错误,请先检查:
-- ① 当前是否已切换到正确的 database;-- ② 是否具备相应 CREATE / GRANT 权限;-- ③ 是否已执行 FLUSH PRIVILEGES;-- ④ 是否有同名对象已存在需先 DROP。/* ------------------------------------------ */
/* 示例脚本结束。*/
/* ------------------------------------------ */
3️⃣ 使用者管理与授权细节
"我需要对不同角色授予不同访问级别,但忘记了如何撤销和重新分配?"
| 操作类型 | 示例语句 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 删除使用者 |
| |||||||||
| 撤销权限 |
| |||||||||
| 修改角色 |
| |||||||||
| 授予全部访问权限 |
| |||||||||
| 授予特定表单一字段访问 | `
`
|

