编写多租户数据库的程序,作为变量的模式

时间:2012-07-05 16:05:08

标签: sql sql-server-2008 schema prepared-statement multi-tenant

我正在设计一个多租户数据库。每个租户所需的许多操作都是作为存储过程编写的。几乎所有这些都使用动态SQL执行,因为我没有找到区分模式而不是动态语句的方法。

EXEC( 'SELECT * FROM ' + @SchemaName + '.Contacts' )

有没有办法创建一个表示模式的变量,所以我可以调用select语句而不动态构建它们?

SELECT * FROM @TheSchema.Contacts

SQL Server 2008

3 个答案:

答案 0 :(得分:2)

FWIW我发现通过数据库而不是模式来分离客户更有用。原因是什么?

  1. 所有模式都可以有相同的过程,因此从模型中派生出来而不必创建任何东西。部署到多个数据库并不比部署到多个模式更复杂,实际上我认为更少,唯一的区别是应用程序必须知道要引用哪个数据库而不是哪个模式。

  2. 不同的客户可以拥有不同的恢复模式,可以根据不同的时间表进行备份等。这可以改善您的备份/恢复计划,尤其是在数据集变大时。

  3. 将每个客户放在一个单独的数据库中,如果租户对于当前的服务器来说太大,就很容易将租户移动到另一个服务器。仅为其架构提取数据和对象将非常复杂。

  4. 有些客户可能在法律上和/或合同上要求您不将其数据存储在与其他客户相同的数据库中。

答案 1 :(得分:0)

更简单的解决方案是将存储过程保留在每个租户数据库中并在其中执行。

答案 2 :(得分:0)

这个问题有点陈旧,但我正在考虑将此选项作为节省成本的措施 - 因为许多云提供商对每个数据库收费并且与存储相关的成本较低 - 对多租户小型数据库尤其有用。

根据我的理解,可以为登录设置默认架构,因此,为每个登录设置架构会自动将该架构用于所有查询和sprocs。对于那些遇到这个问题的人来说需要考虑一些事情。