我们正在考虑使用单个SQL Server数据库来存储多个客户端的数据。我们觉得让一个数据库中的所有数据都可以比每个客户端的单独数据库更易于管理。设置。
我们最担心的是偶然访问错误的客户端。如果我们不小心将一个客户的数据显示给另一个客户,那将是非常非常糟糕的。我们执行了大量的查询,并且害怕有人说'#34;给我写一个查询,然后在15分钟内向客户展示会议。"如果有人粗心并省略了为正确客户过滤的WHERE
条款,那么我们将遇到严重问题。 SQL Server是否存在强大的设置或设计模式,使得无法(或至少非常困难)从单个全局"中无意中提取错误的客户端数据。数据库?
要明确的是,这不是客户端直接使用或通过应用程序使用的数据库(尚未)。我们正在谈论我们的几位程序员访问的数据库,我们害怕搞砸自己。
答案 0 :(得分:2)
至少,您应该将客户端数据放在单独的模式中。在SQL Server中,模式是授权的单位。只有授权给定客户的人才能看到该客户的数据。除了其他保护之外,您还应该使用数据库的内置授权功能。
现在,听起来您处于这样一种情况:一小群人正在为每个人访问所有数据。好吧,如果你成功了,那么你将来可能会需要更多的人。实际上,您可能会让一些客户端直接访问数据。如果是他们的数据,他们会希望在其上运行应用程序。
如果您计划成长,我最好的建议是将每个客户的数据放在一个单独的数据库中。我将构建系统,以便此数据库可以位于远程服务器上。如果需要与公共数据同步,那么就开发一种复制策略来移动数据。
您可能认为让一个客户端看到另一个客户端的数据是不好的。从商业角度来看,这是致命的 - 就像“公司破产,没有工作”致命。您的客户可能比您更关心这种机密性。并且,确保保护的架构将使它们更舒适。
答案 1 :(得分:1)
您可以为每个采用必需参数@customerID
的表设置一个内联表值函数,并将该特定表过滤为该客户的数据。如果整个应用程序仅使用这些TVP,那么应用程序将通过构造安全。
可能会有一些性能影响。确切的数字取决于架构和查询。然而,它们可以为零,因为内联TVP与其他查询一起内联和优化。
答案 2 :(得分:1)
多租户数据架构 http://msdn.microsoft.com/en-us/library/aa479086.aspx
这就是我们所做的(不幸的是mysql):
假设您的所有DDL都在源代码管理下的.sql文件中(应该是这样),那么拥有许多数据库或模式就不那么难了。
[1] mysql中的模式称为“数据库”
答案 3 :(得分:0)
您只能通过带有必需的customerid参数的存储过程来限制对数据的访问。 如果您允许IT迟早构建视图,则有人会忘记您所说的where子句。 但是,每个具有预先过滤视图的客户端架构都可以实现自助服务,并带来额外的Brings价值。