1

テナント データを保持する 1 つのデータベースと、テナントごとに 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

各テナント DB 内のウィジェットの数を取得する選択クエリを作成することはできますか? それとも、カーソルまたはストア プロシージャが必要ですか? たとえば、出力は次のようになります。

Tenant, WidgetCount
Bob, 10
Kate, 12
4

3 に答える 3

2

マルチテナンシーのセットアップでは、これらの「全体的な」統計を中央データベースにキャッシュし、定期的に更新することを検討することをお勧めします

たとえば、次の列を持つマスターのテーブル:
TenantId
WidgetCount
AsOfDate

そうすれば、各データベースにアクセスすることなく、非常に迅速に統計を照会できます (ただし、更新の頻度によっては、明らかにデータが古くなっている可能性があります)。

マルチテナンシー システムでのスケーリングには、このアプローチをお勧めします。しかし、それは(いつものように)正確な要件/少し古い統計などで生きていけるかどうかに依存します.

于 2010-09-14T08:30:51.300 に答える
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 

最初にデータを一時テーブルにロードします。一時テーブルを使用してループを実行し、テナント テーブルにリストされているデータベースのリストにある各ウィジェット テーブルからカウントを取得します。

于 2012-02-23T07:39:23.293 に答える
0

時間の経過とともに拡大/縮小するテナントのリストがある場合は、動的 SQL を使用する必要があります。または、テナントが追加または削除されたときに、動的 SQL を使用して、問題の各データベースを参照するビューを生成することもできます。

特定のデータベースを参照したいが、そのデータベースのターゲットが不明な場合は、シノニムを使用して同様の結果を得ることができます。これは、シノニム ターゲットが実行時にバインドされ、作成時にバインドされないためです。

于 2010-09-14T08:26:08.873 に答える