基于模式的多租户与SQLServer和Hibernate

Ime*_*lli 6 sql-server hibernate jpa multi-tenant database-schema

我有兴趣使用hibernate作为提供者和SQLServer作为数据库来实现多租户解决方案.我正在使用基于模式的方法,这意味着一个数据库和不同的模式.

具体来说,我的问题是如何使用SQLServer更改执行模式.我已经将这种方法用于MySQL use $database,PostgreSQL SET search_path TO $schema和Oracle,ALTER SESSION SET CURRENT_SCHEMA = $schema并且我能够成功地从一个模式切换到另一个模式,注意到模式概念因数据库而异.

但是,使用SQLServer,我知道没有改变执行模式的事情.我知道在未授予用户sysadmin角色的情况下切换给定用户的默认架构的可能性.我也知道使用folllwing查询的模拟概念:EXECUTE AS USER = $user.模拟允许一个用户模仿其他用户,这样就可以更改当前用户.

根据定义,切换当前用户可以切换执行模式,因为一旦用户被更改,执行模式就是新用户的默认模式.然而,冒充有一个限制,因为我们不能超过32个执行模拟times.Although有可能执行revert,以避免达到极限模拟数字模拟每一个后,该解决方案是不适合我的情况和我在寻找替代.

有没有人对使用SQLServer和基于模式的方法的多租户实现有任何建议?

还有除我提到的切换执行模式之外的任何解决方案.

非常感谢你的帮助.非常感谢你.

Sar*_*nan 2

以下是需要考虑的要点

  1. SQL Server 通过表中的前缀来区分架构,例如 [dbo].[Users] 和 [Tenant01].[Users]
  2. 由于您没有提到在 SQL Server 中解析每个架构的数据库连接的方式,我想建议您可以看一下支持您的用例的 Azure Shard Map 或构建您自己的,在这种情况下您可以将根据建立的租户上下文从集中存储中获取连接字符串。例如:Tenant01 将映射到 ConnectionString C01,它将具有相同的数据库,但具有不同的用户 ID 和密码。这种方法是更普遍遵循的方法。不过,您也可以选择 Azure Shard Map,它会在幕后为您执行此映射。
  3. 在这种情况下,当您预配架构时,您还可以创建一个 SQL 用户或将 Azure AD 用户映射到该架构,并授予对该架构的必要权限。这确保了访问正常。

如果您由于数据量大幅增长而计划从共享数据库中横向扩展特定租户,则上述将租户明智的连接字符串保留在存储中的选项将很有帮助,以便提供更长的响应时间和更好的性能。其余的租户。

有关 Azure 碎片地图的更多信息

编辑

实际上,当您将用户映射到 SQL Server 中的架构时,您不需要[Schema].[Table]在查询中使用 ,而是可以直接使用[Table],访问会自动发生。您实际上可以使用 like 将用户映射到架构ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;,从那时起,查询不需要表的架构前缀。更多详情请点击这里

华泰