SQL Server перекрестный запрос к базе данных, когда другое имя БД не известно заранее? - PullRequest
1 голос
/ 14 сентября 2010

Учитывая мультитенантную настройку с одной базой данных, которая содержит данные об арендаторах, и одну базу данных для каждого арендатора, как вы можете создать запрос для поиска одинакового фрагмента данных в каждой базе данных арендатора?

Например, в базе данных владельца арендатора есть таблица с именем Арендаторы:

[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

Ответы [ 3 ]

2 голосов
/ 14 сентября 2010

При настройке с несколькими арендаторами я бы рекомендовал рассмотреть возможность кэширования этих «общих» статистических данных в центральной базе данных и их периодического обновления

, например, таблицы в главной странице со следующими столбцами:TenantIdWidgetCountAsOfDate

Таким образом, вы можете очень быстро запрашивать статистику, не затрагивая каждую базу данных (но, очевидно, данные могут быть устаревшими в зависимости от частоты обновления).

Для масштабирования в мультиСистема аренды, я рекомендую этот подход.Но это зависит (как всегда) от точных требований / от того, можете ли вы жить с немного устаревшей статистикой и т. Д.

2 голосов
/ 23 февраля 2012
     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 в списке баз данных, перечисленных в таблице Tenant.

0 голосов
/ 14 сентября 2010

Вам нужно будет использовать динамический SQL, если у вас есть список арендаторов, которые со временем будут увеличиваться / уменьшаться. В качестве альтернативы вы можете при добавлении или удалении арендаторов использовать динамический SQL для генерации представлений, которые ссылаются на каждую из рассматриваемых баз данных.

Если вы хотите просмотреть конкретную базу данных, но еще не знаете, где нацелить эту базу данных, вы можете использовать синоним для достижения аналогичного результата, поскольку цели синонимов связаны во время выполнения, а не создают время.

...