You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL数据库行级访问设计:跨表数据隔离实现问询

实现Azure SQL数据库全库行级数据隔离方案

一、全库行级访问的具体实现步骤

基于你数据库的表结构(User表含Company字段,其他表关联User表),可以通过行级安全(RLS)+ 统一上下文函数的方式实现全库数据隔离,具体步骤如下:

1. 建立用户-公司映射表(用于动态关联登录账号与所属公司)

创建一张映射表存储登录账号对应的公司标识,方便后续新增公司时快速扩展:

CREATE TABLE dbo.UserCompanyMapping (
    LoginName NVARCHAR(128) PRIMARY KEY,
    Company NVARCHAR(128) NOT NULL
);

-- 插入现有5家公司的账号映射
INSERT INTO dbo.UserCompanyMapping VALUES
('CompanyA_Login', 'CompanyA'),
('CompanyB_Login', 'CompanyB'),
('CompanyC_Login', 'CompanyC'),
('CompanyD_Login', 'CompanyD'),
('CompanyE_Login', 'CompanyE');

2. 创建上下文函数,获取当前登录用户对应的公司

这个函数会动态返回当前登录账号所属的公司,作为所有RLS策略的过滤基准:

CREATE FUNCTION dbo.GetCurrentUserCompany()
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT Company
FROM dbo.UserCompanyMapping
WHERE LoginName = SUSER_SNAME();

3. 为所有表创建RLS安全策略

(1)User表直接过滤

User表本身包含Company字段,直接匹配当前用户的公司:

CREATE SECURITY POLICY dbo.UserSecurityPolicy
ADD FILTER PREDICATE EXISTS (
    SELECT 1 FROM dbo.GetCurrentUserCompany() c WHERE c.Company = u.Company
) ON dbo.[User]
WITH (STATE = ON);

(2)关联表通过User表间接过滤

其他所有关联表(如Transaction、Orders等)通过UserId关联到User表,再匹配公司字段:

-- Transaction表示例(假设表含UserId字段关联User表)
CREATE SECURITY POLICY dbo.TransactionSecurityPolicy
ADD FILTER PREDICATE EXISTS (
    SELECT 1 FROM dbo.[User] u
    JOIN dbo.GetCurrentUserCompany() c ON u.Company = c.Company
    WHERE u.UserId = t.UserId
) ON dbo.Transaction
WITH (STATE = ON);

-- Orders表示例(同理)
CREATE SECURITY POLICY dbo.OrdersSecurityPolicy
ADD FILTER PREDICATE EXISTS (
    SELECT 1 FROM dbo.[User] u
    JOIN dbo.GetCurrentUserCompany() c ON u.Company = c.Company
    WHERE u.UserId = o.UserId
) ON dbo.Orders
WITH (STATE = ON);

重复上述逻辑,为剩下的所有事实表、维度表创建对应的安全策略即可。

4. 创建公司账号与权限角色

通过统一角色管理权限,避免重复配置:

-- 创建公司用户专属角色
CREATE ROLE CompanyUser;

-- 授予角色所有表的SELECT权限(按需调整,如不需要写入则仅授予SELECT)
GRANT SELECT ON dbo.[User] TO CompanyUser;
GRANT SELECT ON dbo.Transaction TO CompanyUser;
GRANT SELECT ON dbo.Orders TO CompanyUser;
-- 其他表依次添加

-- 创建服务器级登录账号
CREATE LOGIN CompanyA_Login WITH PASSWORD = 'YourStrongPassword1!';
CREATE LOGIN CompanyB_Login WITH PASSWORD = 'YourStrongPassword2!';
-- 其余3家公司账号同理

-- 在数据库中创建用户并加入角色
CREATE USER CompanyA_Login FOR LOGIN CompanyA_Login;
ALTER ROLE CompanyUser ADD MEMBER CompanyA_Login;

CREATE USER CompanyB_Login FOR LOGIN CompanyB_Login;
ALTER ROLE CompanyUser ADD MEMBER CompanyB_Login;
-- 其余用户同理

5. 新增公司的快速扩展流程

后续新增公司时,仅需3步:

  1. 在服务器级别创建新的登录账号
  2. 在数据库中创建对应用户并加入CompanyUser角色
  3. 在UserCompanyMapping表中插入新的登录名与公司的映射关系

无需修改任何RLS策略,即可自动实现新公司的数据隔离。


二、行级安全是否为防止跨公司数据泄露的最佳方案?

行级安全(RLS)是Azure SQL中实现多租户/多合作公司数据隔离的原生推荐方案,核心优势包括:

  • 透明性:应用层无需修改任何代码,数据库自动过滤不符合权限的行数据
  • 扩展性:通过统一的上下文函数和映射表,新增公司时无需逐个调整表策略
  • 安全性:权限控制在数据库层面,避免应用层漏洞导致的数据泄露

但为了进一步加固安全,建议搭配以下补充措施:

  • 最小权限原则:仅授予公司用户必要的权限(如仅SELECT,禁止修改/删除数据)
  • 启用Azure SQL审计:监控所有用户的访问行为,及时发现异常操作
  • 加密保护:开启透明数据加密(TDE)和传输层加密(SSL),保护静态与传输中的数据
  • 定期权限审查:清理冗余权限,确保权限范围始终符合业务需求

内容的提问来源于stack exchange,提问作者KNP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:36:26