我需要创建新的 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
我还是不知道如何在数据库层面实现。
我的建议是在每个函数上添加用户列,这样您就可以创建简单的函数,并尽可能减少连接,从而获得良好的性能。这是您可以为每个表创建的函数的示例。
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 配合良好。