设计 Azure SQL 数据库中的行级访问

问题描述 投票:0回答:1

我需要创建新的 SQL 数据库,其中包含近 10 个表,包括所有事实表和维度表。该数据库存储来自多个合作伙伴公司的多个用户的数据。

用户表 - 用户 ID、姓名、年龄、性别、公司...等

交易表 - TransactionID、TransactionTime、UserId、TransactionSeq、OrderId、StatusId...等

订单表 - OrderId、OrderCount、ItemId

项目表 - 项目 ID、项目名称、项目类型等 表4 表5 .....等等

在我的 USER 表中有一个名为 Company 的字段,它标识哪个用户在哪个公司。我想为来自 5 个不同公司的人员创建 5 个登录名,他们应该只能访问由用户表中的公司列标识的公司用户数据。请记住,我将来可以添加更多公司。

从上面的表结构中我们可以看到,每个表中都没有 Company 列。即使我创建了,它也是我不想创建的冗余数据。

所有表都直接或通过连接几个表连接到 Usertable。我的问题是如何设置行级访问数据库中的所有表,其中应设置行级访问的键列仅在一张表中?

换句话说,如果您从 CompanyA userId 登录,您应该只能在用户表、交易表、订单表等中看到与 CompanyA 相关的数据?

行级访问是设置此功能的最佳方法吗?考虑到公司之间不应该有任何形式的数据泄露。

有很多与数据库中单个表的行级安全性相关的信息,如下所示: https://learn.microsoft.com/en-us/sql/relational-databases/security/row-level-security?view=sql-server-ver16

我还是不知道如何在数据库层面实现。

sql-server azure-sql-database row-level-security
1个回答
0
投票

我的建议是在每个函数上添加用户列,这样您就可以创建简单的函数,并尽可能减少连接,从而获得良好的性能。这是您可以为每个表创建的函数的示例。

ALTER FUNCTION [Security].[fn_RLS_OrderData]
(
  @Comapny int
)
RETURNS TABLE
WITH SCHEMABINDING
AS 
  RETURN
  (
    SELECT 1 as Result
      FROM [Orders] AS d
      INNER JOIN [UsersTable]AS e 
      ON e.[UserLoginContext] = d.UserLogin e.[UserLoginContext] = SUSER_NAME()
      WHERE e.Company   = @Company 
  );

行级安全性与 INNER JOIN 配合良好。

© www.soinside.com 2019 - 2024. All rights reserved.