1

给定一个多租户设置,其中一个数据库保存租户数据,每个租户一个数据库,您如何构建查询以在每个租户数据库中查找相同的数据?

例如,租户主数据库有一个名为 Tenants 的表:

[TenantMaster].[dbo].[Tenants]
Id, Name, DatabaseName
1, Bob, bobs_db_name
2, Kate, kates_db_name

每个单独的租户都有一个名为 Widgets 的表:

[bobs_db_name].[dbo].[Widgets]
Id, Name
1, Red widget

是否可以编写一个选择查询来获取每个租户数据库中的小部件数量?还是需要游标或存储过程?例如输出将是:

Tenant, WidgetCount
Bob, 10
Kate, 12
4

3 回答 3

2
     create table #TenatsWidjetCount 
     (
      TenantID int,
      TenantName nvarchar(100),
      Count int 
      )

     Insert into #TenatsWidjetCount(TenantID,TenantName) 
      select ID,Name from Tenants


      Decalre @Dbname navarchar(100)
      Declare @Min Int;
      Declare @Max Int;
     set @Min=(Select min(TenantID ) from #TenatsWidjetCount )
     set @Max=(Select max(TenantID ) from #TenatsWidjetCount )




     while(@Min<=@Max)
     Begin
     print @min
     set @dbName=(Select DatabaseName From Tenant Where ID=@Min)

     Decalre @Dbname navarchar(100)





     Declare @Selectstring nvarchar(max);

     set @Selectstring='Update  #TenatsWidjetCount 
                  set Count=(select count(*) from   '+@DBname+'.dbo.Widjets)'

 print @Selectstring    
      execute sp_executesql @query=@Selectstring
      print @Selectstring 

      set @min=@min+1
     print @min
     end


     select * from #TenatsWidjetCount 

我们首先将数据加载到临时表..使用临时表我运行一个循环,所以我从租户表中列出的数据库列表中的每个 widjet 表中获取计数..

于 2012-02-23T07:39:23.293 回答
2

在多租户设置中,我建议考虑将这些“全面”统计信息缓存在中央数据库中并定期更新

例如,主表中包含以下列:
TenantId
WidgetCount
AsOfDate

这样,您可以非常快速地查询统计信息,而无需访问每个数据库(但显然数据可能已过期,具体取决于更新频率)。

对于多租户系统中的扩展,我推荐这种方法。但这确实取决于(一如既往)确切的要求/您是否可以忍受稍微过时的统计数据等。

于 2010-09-14T08:30:51.300 回答
0

如果您有一个随时间增长/缩小的租户列表,则需要使用动态 SQL。或者,您可以在添加或删除租户时使用动态 SQL 生成引用每个相关数据库的视图。

如果您想查看特定数据库,但您还不知道该数据库的目标位置,那么您可以使用同义词来获得类似的结果,因为同义词目标在执行时绑定,而不是在创建时绑定。

于 2010-09-14T08:26:08.873 回答