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

Sql 多租户数据库的编写过程,模式为变量,sql,sql-server-2008,schema,prepared-statement,multi-tenant,Sql,Sql Server 2008,Schema,Prepared Statement,Multi Tenant,我正在设计一个多租户数据库。每个租户所需的许多操作都已编写为存储过程。几乎所有模式都使用动态SQL执行,因为除了使用动态语句之外,我还没有找到区分模式的方法 EXEC( 'SELECT * FROM ' + @SchemaName + '.Contacts' ) 有没有办法创建一个表示模式的变量,这样我就可以调用select语句而无需动态构建它们 SELECT * FROM @TheSchema.Contacts SQL Server 2008一个更简单的解决方案是将存储过程保存在每个租户数

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

EXEC( 'SELECT * FROM ' + @SchemaName + '.Contacts' )
有没有办法创建一个表示模式的变量,这样我就可以调用select语句而无需动态构建它们

SELECT * FROM @TheSchema.Contacts

SQL Server 2008

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

FWIW我发现通过数据库而不是模式来区分客户要有用得多。原因是什么

所有模式都可以有相同的过程,从而从模型中派生它们,而不必创建任何东西。部署到多个数据库并不比部署到多个模式复杂,事实上我认为没有那么复杂,唯一的区别是应用程序必须知道引用哪个数据库,而不是哪个模式

不同的客户可以有不同的恢复模式,可以按不同的计划进行备份,等等。这可以改进您的备份/恢复计划,尤其是在数据集越来越大的情况下

将每个客户放在一个单独的数据库中,可以很容易地将租户移动到不同的服务器,如果他们对于当前的服务器来说太大的话。仅为模式提取数据和对象将非常复杂

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


这个问题有点老了,但我正在考虑将此选项作为一种成本节约措施——因为许多云提供商对每个数据库收费,而且与存储相关的成本较低——对于多租户小型数据库来说尤其有用


据我所知,可以为登录设置默认模式,因此,为每个登录设置一个模式将自动将该模式用于所有查询和存储过程。对于那些遇到这个问题的人来说,需要考虑的事情。

如果我正在编写一个存储过程来实际创建它的模式和表,我就不能这么做。对该场景有何建议?@Sparafusile为什么元数据创建过程使用动态SQL会如此糟糕?@Sprafusile,通常使用DB脚本文件创建租户数据库。不是通过存储过程。@Aaron Bertrand我不是说它有什么问题,只是想知道是否有替代方案。它是多租户模式,而不是数据库。@TheSchema在这里真正代表什么?一个自定义模式,或者一个数据库名和一个模式名?只是模式。连接暗示了数据库。虽然我感谢反馈,但已经做出了选择。而不是我。我只是想找到一种方法,使过程更易于使用。您不能将变量用于顶级实体,如数据库、架构、表和列,因此在动态SQL之外,或者通过使用PowerShell、C等替换令牌来在外部生成脚本。我不知道有什么方法可以做到这一点…谢谢,这就是我想知道的。这是一个很好的观点,也是我意识到的。我的问题更倾向于维护脚本,例如,您可能需要在模式列表中循环,并向特定表中添加一列。