2012-08-09 94 views
4

我们正在考虑使用单个SQL Server数据库来存储多个客户端的数据。我们觉得在一个数据库中的所有数据可以比“每个客户端独立的数据库”设置更容易管理。SQL Server - 强大的客户端数据保护(多租户)

我们最担心的是意外访问错误的客户端。如果我们偶然将一个客户的数据显示给另一个客户,这将是非常非常糟糕的。我们执行了很多查询,并且担心有人说“给我写这个问题的查询,并在15分钟内向客户开会”。如果有人粗心大意并忽略了为正确客户端筛选的WHERE条款,那么我们将陷入严重困境。是否有强大的SQL Server设置或设计模式,使它不可能(或者至少非常困难)意外地从单个“全局”数据库中提取错误的客户端数据?

需要说明的是,这不是客户端直接使用或通过应用程序使用的数据库(尚)。我们正在谈论一些由我们的程序员访问的数据库,我们害怕自己搞砸了。

+1

请先阅读本http://msdn.microsoft.com/en-us/library/aa479086.aspx – 2012-08-09 19:23:43

回答

2

至少应该将客户端数据放在单独的模式中。在SQL Server中,模式是授权的单位。只有授权给定客户的人才能看到客户的数据。除了其他保护之外,您应该使用数据库的内置授权功能。

现在,这听起来像是你处于一个非常小的一群人访问所有人的数据的情况。那么,如果你成功了,那么你将来可能需要更多的人。事实上,您可能会让某些客户直接访问数据。如果这是他们的数据,他们会希望在其上运行应用程序。

我最好的建议,如果你打算增长,就是把每个客户的数据放在一个单独的数据库中。我会构建系统,以便该数据库可以位于远程服务器上。如果需要与常用数据同步,则需要制定移动数据的复制策略。

可能认为让一个客户端看到另一个客户端的数据是不好的。从商业角度来看,这是致命的 - 就像“公司倒闭,没有工作”一样致命。您的客户可能比您更关心保密性。而且,确保保护的架构将使他们更舒适。

+0

是的,我们需要确保意外访问客户端数据是永远不会发生的事情。我想你不认为大量的复杂数据库会变得不稳定?例如,如果需要对任何数据库对象进行更改,则必须针对所有数据库执行此操作... – Tekito 2012-08-09 19:27:28

+0

嗯,大概这就是为什么客户要向您付费以维护此功能。会发生什么是你将开发一套简单的工具(希望存储过程),这将使这成为可能。您将需要一个发布过程。这实际上是一件好事。您还必须处理发布新功能的情况,但一位客户希望继续使用旧系统。 – 2012-08-09 19:31:43

+0

标记为答案,因为我认为最终这是老板最终要做的,即使我最初是在寻求单数据库解决方案。 – Tekito 2012-08-10 22:37:55

1

您可以为每个采用必需参数@customerID的表格设置一个内嵌表值函数,并将该特定表格过滤为该客户的数据。如果整个应用程序只使用这些TVP的应用程序将是安全施工

可能会有一些性能影响。确切的数字取决于模式和查询。然而,它们可以为零,因为内联TVP与查询的其余部分一起被内联和优化。

+0

同意,将工作,只要只有TVF被使用过,但仍然担心忽略TVF的程序员,并自己写一个查询表。 – Tekito 2012-08-09 19:18:18

+0

您可以轻松地通过阅读代码来审计代码。你可以*证明*它很容易正确。 – usr 2012-08-09 19:21:46

1

多租户数据架构 http://msdn.microsoft.com/en-us/library/aa479086.aspx

这里是我们做什么(MySQL的不幸):

    每个表
  1. 表是一个模式
  2. “租客” 栏[1]
  3. 视图位于另一个架构中(以便于安全和命名)。视图不得包含租户列。视图确实基于当前用户上租客WHERE
  4. 承租人值是通过在刀片触发设置,基于用户

假设所有的DDL是SQL文件源控制下(它应该be),那么拥有许多数据库或模式并不那么困难。

[1]在MySQL的模式被称为“数据库”

+0

感谢您的链接,非常翔实 – Tekito 2012-08-10 22:39:18