数据库的多个位置和不同的用户权限

时间:2015-04-23 16:24:31

标签: sql sql-server

我不确定最好的路线是什么。我有一个客户,他的业务有3个不同的位置。每个地点的员工只能访问其位置数据。所有者可以访问所有...然后,不同的角色应该只能访问他们的东西(财务可以看到财务而不是销售等)。

最好的方法是什么?我能想到的解决方案是:

  1. 创建用户表,提供位置ID和角色ID,并以此为基础创建数据。这需要很多地添加位置ID ..
  2. 创建3个独立的数据库,并根据角色ID显示信息。这似乎并不理想
  3. 在数据库端使用功能,存储过程等......

1 个答案:

答案 0 :(得分:1)

multi-tenancy security model改造为现有数据库并不是一项简单的任务 - IMO应该从一开始就设计到模型中。

一个非常简单的模型(每个用户一个角色,每个用户一个位置)看起来像这样:

-- You need to add simple lookup tables for Role, Location
CREATE TABLE User
(
   UserId INT, -- PK
   RoleId INT, -- FK
   LocationId INT NULL -- FK
);

所有敏感表都要么直接需要LocationId分类,要么可以连接到具有LocationId分类的表,即:

CREATE TABLE SomeTable -- with location-sensitive data
(
   Col1 ... Col N,
   LocationId INT
);

然而,困难的部分是调整敏感数据表上的所有系统查询,以便它们现在强制执行特定于位置的限制。这通常作为附加的谓词过滤器完成,该过滤器附加到在这些表上完成的查询的where子句,然后连接回用户位置表:

SELECT Col1 ... ColN
FROM SomeTable
   INNER JOIN User on SomeTable.LocationId = User.LocationId
WHERE -- Usual Filter Criteria
   AND ((User.UserId = @UserIdExecutingThisQuery 
         AND User.RoleId = `Finance`) -- Well, the Id for Finance
        OR User.RoleId = `Administrator`) -- Well, the Id for Admin

作为重新设计工作的结果,作为短期解决方案,您可能会考虑维护3个不同的区域数据库(或同一数据库中的3个区域模式),然后使用复制或类似工具来集中所有数据到要使用的owner角色的主数据库。

这将使您有时间重新设计数据库(和应用程序)以使用多租户设计。我建议一个更全面的模型,允许每个用户有多个角色,每个用户有多个位置(即很多连接表),而不是这里显示的简单模型。