SQLServer教程FG052-SQLServer多租户架构实战
目录大纲
内容简介
本文档基于SQLServer官方文档的多租户相关内容,结合生产环境实际情况,详细讲解SQLServer多租户架构的设计、实施和管理等内容。风哥教程参考SQLServer官方文档Multi-tenant Applications、Database Design等相关章节。
Part01-基础概念与理论知识
1.1 多租户概念
多租户概念:
- 多租户是指一个软件应用同时服务于多个租户(客户)的架构模式
- 每个租户的数据相互隔离,租户之间无法访问彼此的数据
- 多租户架构可以提高资源利用率,降低运维成本
- 多租户架构广泛应用于SaaS(软件即服务)模式
更多视频教程www.fgedu.net.cn
1.2 多租户架构模式
多租户架构模式:
- 共享数据库共享表:所有租户共享同一个数据库和表,通过租户ID字段区分不同租户的数据
- 共享数据库隔离表:所有租户共享同一个数据库,但每个租户有独立的表
- 隔离数据库:每个租户有独立的数据库,完全隔离
学习交流加群风哥微信: itpux-com
1.3 多租户设计原则
多租户设计原则:
- 数据隔离:确保租户之间的数据完全隔离
- 安全性:保护租户数据的安全
- 可扩展性:支持租户数量的增长
- 性能:确保系统在多租户环境下的性能
- 可维护性:便于系统的维护和升级
学习交流加群风哥QQ113257174
Part02-生产环境规划与建议
2.1 多租户架构规划
多租户架构规划:
- 架构选择:根据租户数量、数据量、性能要求等选择合适的架构模式
- 数据模型设计:设计适合多租户的数据模型
- 索引设计:设计适合多租户的索引
- 存储规划:规划存储容量,考虑租户增长
- 备份策略:制定适合多租户的备份策略
- 监控方案:建立多租户监控体系
风哥提示:多租户架构规划应根据业务需求和技术环境制定,确保系统的可扩展性和性能
2.2 多租户数据隔离
多租户数据隔离:
- 逻辑隔离:通过租户ID字段区分不同租户的数据
- 物理隔离:通过独立的数据库或表空间隔离不同租户的数据
- 权限隔离:通过权限控制确保租户只能访问自己的数据
- 网络隔离:通过网络隔离确保租户之间的网络隔离
更多学习教程公众号风哥教程itpux_com
2.3 多租户性能优化
多租户性能优化:
- 索引优化:为租户ID字段创建索引,提高查询性能
- 查询优化:优化查询语句,减少全表扫描
- 缓存优化:使用缓存,减少数据库查询
- 分区表:使用分区表,提高大表查询性能
- 资源隔离:隔离不同租户的资源使用
- 负载均衡:使用负载均衡,分散系统负载
from SQLServer视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 多租户架构实施步骤
多租户架构实施步骤:
— 选择多租户架构模式
— 设计数据模型
— 设计索引策略
— 步骤2:环境准备
— 安装和配置SQLServer
— 创建数据库和表
— 配置权限
— 步骤3:数据模型实现
— 创建租户表
— 创建业务表,添加租户ID字段
— 创建索引
— 步骤4:应用程序开发
— 实现租户认证和授权
— 实现数据访问层,添加租户ID过滤
— 实现租户管理功能
— 步骤5:测试验证
— 测试数据隔离
— 测试性能
— 测试安全性
— 步骤6:部署上线
— 部署应用程序
— 迁移数据
— 监控系统运行状态
— 步骤7:维护管理
— 定期备份数据
— 监控系统性能
— 处理租户请求
执行结果:
– 架构模式:共享数据库共享表
– 数据模型:租户表 + 业务表(带租户ID字段)
– 索引策略:为租户ID字段创建索引
环境准备完成:
– SQLServer 2022 Enterprise Edition
– 数据库:fgedudb
– 权限配置:完成
数据模型实现完成:
– 租户表:fgedu.tenants
– 业务表:fgedu.sales(带tenant_id字段)
– 索引:IX_sales_tenant_id
应用程序开发完成:
– 租户认证和授权:实现
– 数据访问层:实现,添加租户ID过滤
– 租户管理功能:实现
测试验证完成:
– 数据隔离测试:通过
– 性能测试:通过
– 安全性测试:通过
部署上线完成:
– 应用程序部署:完成
– 数据迁移:完成
– 监控系统:运行正常
维护管理:
– 定期备份:配置完成
– 系统监控:配置完成
– 租户管理:正常
3.2 多租户数据模型
多租户数据模型:
— 创建租户表
CREATE TABLE fgedu.tenants (
tenant_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_name VARCHAR(100) NOT NULL,
created_at DATETIME DEFAULT GETDATE(),
updated_at DATETIME DEFAULT GETDATE()
);
— 创建业务表,添加租户ID字段
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_id INT NOT NULL,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50),
FOREIGN KEY (tenant_id) REFERENCES fgedu.tenants(tenant_id)
);
— 创建索引
CREATE INDEX IX_sales_tenant_id ON fgedu.sales(tenant_id);
CREATE INDEX IX_sales_tenant_id_sale_date ON fgedu.sales(tenant_id, sale_date);
— 2. 共享数据库隔离表模式
— 创建租户表
CREATE TABLE fgedu.tenants (
tenant_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_name VARCHAR(100) NOT NULL,
table_prefix VARCHAR(50) NOT NULL,
created_at DATETIME DEFAULT GETDATE(),
updated_at DATETIME DEFAULT GETDATE()
);
— 为每个租户创建独立的表
— 示例:为租户1创建销售表
CREATE TABLE fgedu.tenant_1_sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 3. 隔离数据库模式
— 为每个租户创建独立的数据库
— 示例:为租户1创建数据库
CREATE DATABASE fgedu_tenant_1;
— 在租户数据库中创建表
USE fgedu_tenant_1;
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 4. 数据访问示例
— 共享数据库共享表模式
— 插入数据
INSERT INTO fgedu.sales (tenant_id, product_id, customer_id, sale_date, amount, status)
VALUES (1, 1, 1001, GETDATE(), 1000.00, ‘COMPLETED’);
— 查询数据
SELECT * FROM fgedu.sales WHERE tenant_id = 1;
— 共享数据库隔离表模式
— 插入数据
INSERT INTO fgedu.tenant_1_sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 1001, GETDATE(), 1000.00, ‘COMPLETED’);
— 查询数据
SELECT * FROM fgedu.tenant_1_sales;
— 隔离数据库模式
— 切换到租户数据库
USE fgedu_tenant_1;
— 插入数据
INSERT INTO fgedu.sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 1001, GETDATE(), 1000.00, ‘COMPLETED’);
— 查询数据
SELECT * FROM fgedu.sales;
执行结果:
表创建成功:
– fgedu.tenants
– fgedu.sales
索引创建成功:
– IX_sales_tenant_id
– IX_sales_tenant_id_sale_date
数据插入成功:
(1 rows affected)
数据查询成功:
sale_id tenant_id product_id customer_id sale_date amount status
———– ———– ———– ———– ———————– ——————— ——————–
1 1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
共享数据库隔离表模式:
表创建成功:
– fgedu.tenants
– fgedu.tenant_1_sales
数据插入成功:
(1 rows affected)
数据查询成功:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
隔离数据库模式:
数据库创建成功:
– fgedu_tenant_1
表创建成功:
– fgedu.sales
数据插入成功:
(1 rows affected)
数据查询成功:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
3.3 多租户安全管理
多租户安全管理:
— 创建租户用户
CREATE LOGIN tenant_1_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_1_user FOR LOGIN tenant_1_login;
— 授予租户用户访问权限
— 共享数据库共享表模式
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.sales TO tenant_1_user;
— 创建视图,过滤租户数据
CREATE VIEW fgedu.tenant_1_sales AS
SELECT * FROM fgedu.sales WHERE tenant_id = 1;
— 授予租户用户访问视图的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_1_sales TO tenant_1_user;
— 共享数据库隔离表模式
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_1_sales TO tenant_1_user;
— 隔离数据库模式
— 在租户数据库中创建用户
USE fgedu_tenant_1;
CREATE USER tenant_1_user FOR LOGIN tenant_1_login;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.sales TO tenant_1_user;
— 2. 数据加密
— 启用透明数据加密 (TDE)
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘MasterKeyPassword123!’;
CREATE CERTIFICATE TDECertificate WITH SUBJECT = ‘TDE Certificate’;
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TDECertificate;
ALTER DATABASE fgedudb SET ENCRYPTION ON;
— 3. 审计
— 创建服务器审计
CREATE SERVER AUDIT TenantAudit TO FILE (FILEPATH = ‘E:\SQLServer\Audit\’);
ALTER SERVER AUDIT TenantAudit WITH (STATE = ON);
— 创建数据库审计规范
USE fgedudb;
CREATE DATABASE AUDIT SPECIFICATION TenantAuditSpec FOR SERVER AUDIT TenantAudit ADD (SELECT, INSERT, UPDATE, DELETE ON fgedu.sales BY public);
ALTER DATABASE AUDIT SPECIFICATION TenantAuditSpec WITH (STATE = ON);
— 4. 连接管理
— 限制租户连接数
EXEC sp_configure ‘user connections’, 1000;
RECONFIGURE;
— 配置连接池
— 在应用程序配置文件中设置
—
执行结果:
租户用户创建成功:
– tenant_1_login
– tenant_1_user
权限授予成功:
– 授予租户用户访问fgedu.sales的权限
视图创建成功:
– fgedu.tenant_1_sales
数据加密:
主密钥创建成功。
证书创建成功。
数据库加密密钥创建成功。
数据库加密已启用。
审计:
服务器审计创建成功:TenantAudit
数据库审计规范创建成功:TenantAuditSpec
连接管理:
配置选项 ‘user connections’ 已从 0 更改为 1000。运行 RECONFIGURE 语句进行安装。
Part04-生产案例与实战讲解
4.1 共享数据库共享表案例
共享数据库共享表实战:
— 步骤1:创建租户表
CREATE TABLE fgedu.tenants (
tenant_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_name VARCHAR(100) NOT NULL,
created_at DATETIME DEFAULT GETDATE(),
updated_at DATETIME DEFAULT GETDATE()
);
— 步骤2:创建业务表
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_id INT NOT NULL,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50),
FOREIGN KEY (tenant_id) REFERENCES fgedu.tenants(tenant_id)
);
— 步骤3:创建索引
CREATE INDEX IX_sales_tenant_id ON fgedu.sales(tenant_id);
CREATE INDEX IX_sales_tenant_id_sale_date ON fgedu.sales(tenant_id, sale_date);
— 步骤4:插入租户数据
INSERT INTO fgedu.tenants (tenant_name)
VALUES (‘租户1’), (‘租户2’), (‘租户3’);
— 步骤5:插入业务数据
— 租户1数据
INSERT INTO fgedu.sales (tenant_id, product_id, customer_id, sale_date, amount, status)
VALUES (1, 1, 1001, GETDATE(), 1000.00, ‘COMPLETED’),
(1, 2, 1002, GETDATE(), 2000.00, ‘COMPLETED’),
(1, 3, 1003, GETDATE(), 3000.00, ‘PENDING’);
— 租户2数据
INSERT INTO fgedu.sales (tenant_id, product_id, customer_id, sale_date, amount, status)
VALUES (2, 1, 2001, GETDATE(), 1500.00, ‘COMPLETED’),
(2, 2, 2002, GETDATE(), 2500.00, ‘COMPLETED’),
(2, 3, 2003, GETDATE(), 3500.00, ‘PENDING’);
— 租户3数据
INSERT INTO fgedu.sales (tenant_id, product_id, customer_id, sale_date, amount, status)
VALUES (3, 1, 3001, GETDATE(), 1200.00, ‘COMPLETED’),
(3, 2, 3002, GETDATE(), 2200.00, ‘COMPLETED’),
(3, 3, 3003, GETDATE(), 3200.00, ‘PENDING’);
— 步骤6:查询租户数据
— 查询租户1数据
SELECT * FROM fgedu.sales WHERE tenant_id = 1;
— 查询租户2数据
SELECT * FROM fgedu.sales WHERE tenant_id = 2;
— 查询租户3数据
SELECT * FROM fgedu.sales WHERE tenant_id = 3;
— 步骤7:创建视图
— 为租户1创建视图
CREATE VIEW fgedu.tenant_1_sales AS
SELECT * FROM fgedu.sales WHERE tenant_id = 1;
— 为租户2创建视图
CREATE VIEW fgedu.tenant_2_sales AS
SELECT * FROM fgedu.sales WHERE tenant_id = 2;
— 为租户3创建视图
CREATE VIEW fgedu.tenant_3_sales AS
SELECT * FROM fgedu.sales WHERE tenant_id = 3;
— 步骤8:授予权限
— 创建租户用户
CREATE LOGIN tenant_1_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_1_user FOR LOGIN tenant_1_login;
CREATE LOGIN tenant_2_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_2_user FOR LOGIN tenant_2_login;
CREATE LOGIN tenant_3_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_3_user FOR LOGIN tenant_3_login;
— 授予权限
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_1_sales TO tenant_1_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_2_sales TO tenant_2_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_3_sales TO tenant_3_user;
执行结果:
– fgedu.tenants
– fgedu.sales
索引创建成功:
– IX_sales_tenant_id
– IX_sales_tenant_id_sale_date
租户数据插入成功:
(3 rows affected)
业务数据插入成功:
(3 rows affected)
(3 rows affected)
(3 rows affected)
查询租户1数据:
sale_id tenant_id product_id customer_id sale_date amount status
———– ———– ———– ———– ———————– ——————— ——————–
1 1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
2 1 2 1002 2025-04-08 10:00:00.000 2000.00 COMPLETED
3 1 3 1003 2025-04-08 10:00:00.000 3000.00 PENDING
查询租户2数据:
sale_id tenant_id product_id customer_id sale_date amount status
———– ———– ———– ———– ———————– ——————— ——————–
4 2 1 2001 2025-04-08 10:00:00.000 1500.00 COMPLETED
5 2 2 2002 2025-04-08 10:00:00.000 2500.00 COMPLETED
6 2 3 2003 2025-04-08 10:00:00.000 3500.00 PENDING
查询租户3数据:
sale_id tenant_id product_id customer_id sale_date amount status
———– ———– ———– ———– ———————– ——————— ——————–
7 3 1 3001 2025-04-08 10:00:00.000 1200.00 COMPLETED
8 3 2 3002 2025-04-08 10:00:00.000 2200.00 COMPLETED
9 3 3 3003 2025-04-08 10:00:00.000 3200.00 PENDING
视图创建成功:
– fgedu.tenant_1_sales
– fgedu.tenant_2_sales
– fgedu.tenant_3_sales
租户用户创建成功:
– tenant_1_login / tenant_1_user
– tenant_2_login / tenant_2_user
– tenant_3_login / tenant_3_user
权限授予成功:
– 授予租户1用户访问fgedu.tenant_1_sales的权限
– 授予租户2用户访问fgedu.tenant_2_sales的权限
– 授予租户3用户访问fgedu.tenant_3_sales的权限
4.2 共享数据库隔离表案例
共享数据库隔离表实战:
— 步骤1:创建租户表
CREATE TABLE fgedu.tenants (
tenant_id INT IDENTITY(1,1) PRIMARY KEY,
tenant_name VARCHAR(100) NOT NULL,
table_prefix VARCHAR(50) NOT NULL,
created_at DATETIME DEFAULT GETDATE(),
updated_at DATETIME DEFAULT GETDATE()
);
— 步骤2:插入租户数据
INSERT INTO fgedu.tenants (tenant_name, table_prefix)
VALUES (‘租户1’, ‘tenant_1’), (‘租户2’, ‘tenant_2’), (‘租户3’, ‘tenant_3’);
— 步骤3:为每个租户创建独立的表
— 为租户1创建销售表
CREATE TABLE fgedu.tenant_1_sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 为租户2创建销售表
CREATE TABLE fgedu.tenant_2_sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 为租户3创建销售表
CREATE TABLE fgedu.tenant_3_sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 步骤4:插入业务数据
— 租户1数据
INSERT INTO fgedu.tenant_1_sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 1001, GETDATE(), 1000.00, ‘COMPLETED’),
(2, 1002, GETDATE(), 2000.00, ‘COMPLETED’),
(3, 1003, GETDATE(), 3000.00, ‘PENDING’);
— 租户2数据
INSERT INTO fgedu.tenant_2_sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 2001, GETDATE(), 1500.00, ‘COMPLETED’),
(2, 2002, GETDATE(), 2500.00, ‘COMPLETED’),
(3, 2003, GETDATE(), 3500.00, ‘PENDING’);
— 租户3数据
INSERT INTO fgedu.tenant_3_sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 3001, GETDATE(), 1200.00, ‘COMPLETED’),
(2, 3002, GETDATE(), 2200.00, ‘COMPLETED’),
(3, 3003, GETDATE(), 3200.00, ‘PENDING’);
— 步骤5:查询租户数据
— 查询租户1数据
SELECT * FROM fgedu.tenant_1_sales;
— 查询租户2数据
SELECT * FROM fgedu.tenant_2_sales;
— 查询租户3数据
SELECT * FROM fgedu.tenant_3_sales;
— 步骤6:授予权限
— 创建租户用户
CREATE LOGIN tenant_1_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_1_user FOR LOGIN tenant_1_login;
CREATE LOGIN tenant_2_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_2_user FOR LOGIN tenant_2_login;
CREATE LOGIN tenant_3_login WITH PASSWORD = ‘Password123!’;
CREATE USER tenant_3_user FOR LOGIN tenant_3_login;
— 授予权限
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_1_sales TO tenant_1_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_2_sales TO tenant_2_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.tenant_3_sales TO tenant_3_user;
执行结果:
– fgedu.tenants
租户数据插入成功:
(3 rows affected)
租户表创建成功:
– fgedu.tenant_1_sales
– fgedu.tenant_2_sales
– fgedu.tenant_3_sales
业务数据插入成功:
(3 rows affected)
(3 rows affected)
(3 rows affected)
查询租户1数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
2 2 1002 2025-04-08 10:00:00.000 2000.00 COMPLETED
3 3 1003 2025-04-08 10:00:00.000 3000.00 PENDING
查询租户2数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 2001 2025-04-08 10:00:00.000 1500.00 COMPLETED
2 2 2002 2025-04-08 10:00:00.000 2500.00 COMPLETED
3 3 2003 2025-04-08 10:00:00.000 3500.00 PENDING
查询租户3数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 3001 2025-04-08 10:00:00.000 1200.00 COMPLETED
2 2 3002 2025-04-08 10:00:00.000 2200.00 COMPLETED
3 3 3003 2025-04-08 10:00:00.000 3200.00 PENDING
租户用户创建成功:
– tenant_1_login / tenant_1_user
– tenant_2_login / tenant_2_user
– tenant_3_login / tenant_3_user
权限授予成功:
– 授予租户1用户访问fgedu.tenant_1_sales的权限
– 授予租户2用户访问fgedu.tenant_2_sales的权限
– 授予租户3用户访问fgedu.tenant_3_sales的权限
4.3 隔离数据库案例
隔离数据库实战:
— 步骤1:创建租户数据库
— 为租户1创建数据库
CREATE DATABASE fgedu_tenant_1;
— 为租户2创建数据库
CREATE DATABASE fgedu_tenant_2;
— 为租户3创建数据库
CREATE DATABASE fgedu_tenant_3;
— 步骤2:在租户数据库中创建表
— 租户1数据库
USE fgedu_tenant_1;
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 租户2数据库
USE fgedu_tenant_2;
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 租户3数据库
USE fgedu_tenant_3;
CREATE TABLE fgedu.sales (
sale_id INT IDENTITY(1,1) PRIMARY KEY,
product_id INT,
customer_id INT,
sale_date DATETIME,
amount DECIMAL(18,2),
status VARCHAR(50)
);
— 步骤3:插入业务数据
— 租户1数据
USE fgedu_tenant_1;
INSERT INTO fgedu.sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 1001, GETDATE(), 1000.00, ‘COMPLETED’),
(2, 1002, GETDATE(), 2000.00, ‘COMPLETED’),
(3, 1003, GETDATE(), 3000.00, ‘PENDING’);
— 租户2数据
USE fgedu_tenant_2;
INSERT INTO fgedu.sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 2001, GETDATE(), 1500.00, ‘COMPLETED’),
(2, 2002, GETDATE(), 2500.00, ‘COMPLETED’),
(3, 2003, GETDATE(), 3500.00, ‘PENDING’);
— 租户3数据
USE fgedu_tenant_3;
INSERT INTO fgedu.sales (product_id, customer_id, sale_date, amount, status)
VALUES (1, 3001, GETDATE(), 1200.00, ‘COMPLETED’),
(2, 3002, GETDATE(), 2200.00, ‘COMPLETED’),
(3, 3003, GETDATE(), 3200.00, ‘PENDING’);
— 步骤4:查询租户数据
— 查询租户1数据
USE fgedu_tenant_1;
SELECT * FROM fgedu.sales;
— 查询租户2数据
USE fgedu_tenant_2;
SELECT * FROM fgedu.sales;
— 查询租户3数据
USE fgedu_tenant_3;
SELECT * FROM fgedu.sales;
— 步骤5:授予权限
— 创建租户用户
CREATE LOGIN tenant_1_login WITH PASSWORD = ‘Password123!’;
CREATE LOGIN tenant_2_login WITH PASSWORD = ‘Password123!’;
CREATE LOGIN tenant_3_login WITH PASSWORD = ‘Password123!’;
— 租户1数据库
USE fgedu_tenant_1;
CREATE USER tenant_1_user FOR LOGIN tenant_1_login;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.sales TO tenant_1_user;
— 租户2数据库
USE fgedu_tenant_2;
CREATE USER tenant_2_user FOR LOGIN tenant_2_login;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.sales TO tenant_2_user;
— 租户3数据库
USE fgedu_tenant_3;
CREATE USER tenant_3_user FOR LOGIN tenant_3_login;
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu.sales TO tenant_3_user;
执行结果:
– fgedu_tenant_1
– fgedu_tenant_2
– fgedu_tenant_3
表创建成功:
– fgedu.sales(在fgedu_tenant_1中)
– fgedu.sales(在fgedu_tenant_2中)
– fgedu.sales(在fgedu_tenant_3中)
业务数据插入成功:
(3 rows affected)
(3 rows affected)
(3 rows affected)
查询租户1数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
2 2 1002 2025-04-08 10:00:00.000 2000.00 COMPLETED
3 3 1003 2025-04-08 10:00:00.000 3000.00 PENDING
查询租户2数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 2001 2025-04-08 10:00:00.000 1500.00 COMPLETED
2 2 2002 2025-04-08 10:00:00.000 2500.00 COMPLETED
3 3 2003 2025-04-08 10:00:00.000 3500.00 PENDING
查询租户3数据:
sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 3001 2025-04-08 10:00:00.000 1200.00 COMPLETED
2 2 3002 2025-04-08 10:00:00.000 2200.00 COMPLETED
3 3 3003 2025-04-08 10:00:00.000 3200.00 PENDING
租户用户创建成功:
– tenant_1_login
– tenant_2_login
– tenant_3_login
权限授予成功:
– 授予租户1用户访问fgedu_tenant_1中fgedu.sales的权限
– 授予租户2用户访问fgedu_tenant_2中fgedu.sales的权限
– 授予租户3用户访问fgedu_tenant_3中fgedu.sales的权限
Part05-风哥经验总结与分享
5.1 多租户架构最佳实践
多租户架构最佳实践:
- 架构选择:根据租户数量、数据量、性能要求等选择合适的架构模式
- 数据模型设计:设计适合多租户的数据模型,添加租户ID字段
- 索引优化:为租户ID字段创建索引,提高查询性能
- 权限管理:使用视图或存储过程,确保租户只能访问自己的数据
- 性能优化:使用缓存、分区表等技术,提高系统性能
- 监控体系:建立多租户监控体系,及时发现问题
- 备份策略:制定适合多租户的备份策略,确保数据安全
- 扩展性:设计可扩展的架构,支持租户数量的增长
更多视频教程www.fgedu.net.cn
5.2 多租户常见问题
常见问题:
- 数据隔离:确保租户之间的数据完全隔离
- 性能问题:多租户环境下的性能优化
- 扩展性:支持租户数量的增长
- 备份恢复:多租户环境下的备份和恢复
- 安全问题:保护租户数据的安全
- 管理复杂度:多租户环境的管理复杂度
学习交流加群风哥微信: itpux-com
5.3 多租户未来趋势
未来趋势:
- 云原生:结合云服务,实现弹性扩展
- 容器化:使用容器技术,简化部署和管理
- Serverless:使用Serverless架构,按需付费
- 智能化:使用AI和机器学习技术,优化多租户管理
- 边缘计算:将计算能力下沉到边缘,提高响应速度
学习交流加群风哥QQ113257174
风哥提示:多租户架构是SaaS模式的核心技术之一,应根据业务需求和技术环境选择合适的架构模式,确保系统的可扩展性、性能和安全性。
更多学习教程公众号风哥教程itpux_com
from SQLServer视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
