我正在设计一个多租户数据库。许多基于每个租户所需的操作已被编写为存储过程。几乎所有这些都使用动态 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 我发现按数据库区分客户比按模式区分客户更有用。原因?
所有模式都可以具有相同的过程,因此从模型中派生它们而不必创建任何东西。部署到多个数据库并不比部署到多个架构复杂,实际上我认为更复杂,唯一的区别是应用程序必须知道要引用哪个数据库而不是哪个架构。
不同的客户可以有不同的恢复模式,按照不同的时间表进行备份等。这可以改善您的备份/恢复计划,尤其是在数据集变大时。
将每个客户放在一个单独的数据库中,如果租户对于当前服务器来说太大,则可以很容易地将其移动到不同的服务器。仅为其模式提取数据和对象将非常复杂。
一些客户可能在法律和/或合同上要求您不要将他们的数据存储在与其他客户相同的数据库中。
这个问题有点老了,但我正在考虑将此选项作为一种节省成本的措施——因为许多云提供商对每个数据库收费并且与存储相关的成本较少——对于多租户小型数据库尤其有用。
据我了解,可以为登录设置默认模式,因此,为每个登录设置一个模式将自动将该模式用于所有查询和存储过程。遇到这个问题的人需要考虑的事情。
一个更简单的解决方案是将存储过程保存在每个租户数据库中并在其中执行它。