2010-09-14 27 views
1

Étant donné une configuration multi-locataire avec une base de données contenant les données de client hébergé et une base de données pour chaque client hébergé, comment pouvez-vous créer une requête pour rechercher la même donnée dans chaque base de données de client?Requête de base de données croisée SQL Server lorsque l'autre nom de base de données n'est pas connu à l'avance?

par exemple la base de données principale locataire a une table appelée locataires:

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

Et chaque locataire individuel a une table appelée Widgets:

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

Est-il possible d'écrire une requête de sélection pour obtenir le nombre de widgets dans chaque DB de locataire? Ou faut-il un curseur ou une procédure de magasin? par exemple, la sortie serait:

Tenant, WidgetCount 
Bob, 10 
Kate, 12 
+0

oui: utilisation de TSQL dynamique –

Répondre

0

Vous auriez besoin d'utiliser SQL dynamique si vous avez une liste de locataires qui va augmenter/diminuer au fil du temps. Vous pouvez également, lorsque des locataires sont ajoutés ou supprimés, utiliser le SQL dynamique pour générer des vues qui référencent chacune des bases de données en question. Si vous voulez rechercher dans une base de données spécifique, mais que vous ne savez pas encore où cibler cette base de données, vous pouvez utiliser un synonyme pour obtenir un résultat similaire, car les cibles de synonymes sont liées à l'exécution, et non créer du temps.

2

Dans une configuration multi-location, je vous recommande la mise en cache compte tenu de ces « transversales » à bord des statistiques dans une base de données centrale et la mise à jour périodiquement

par exemple une table dans le maître avec des colonnes suivantes:
TenantID
widgetCount
AsOfDate

De cette façon, vous pouvez interroger les stats très rapidement sans frapper chaque base de données (mais évidemment les données peuvent être à jour en fonction de la fréquence de la mise à jour).

Pour la mise à l'échelle dans un système multiclient, je recommande cette approche. Mais il ne dépend (comme toujours) sur les exigences exactes/si vous pouvez vivre avec un peu de ce jour les statistiques etc.

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<[email protected]) 
    Begin 
    print @min 
    set @dbName=(Select DatabaseName From Tenant Where [email protected]) 

    Decalre @Dbname navarchar(100) 





    Declare @Selectstring nvarchar(max); 

    set @Selectstring='Update #TenatsWidjetCount 
        set Count=(select count(*) from '[email protected]+'.dbo.Widjets)' 

print @Selectstring  
     execute sp_executesql @[email protected] 
     print @Selectstring 

     set @[email protected]+1 
    print @min 
    end 


    select * from #TenatsWidjetCount 

nous d'abord charger les données à une température table..using la temptable je lance une boucle si Je reçois le compte de chaque table de widjet dans la liste des bases de données répertoriées dans la table du locataire.