2016-11-30 1 views
0

J'ai une énorme instance contenant plus de 1000 bases de données. Je dois trouver un moyen d'interroger l'instance entière et de trouver des bases de données qui contiennent un utilisateur particulier et quel est le rôle de cet utilisateur. Je ne suis pas intéressé si l'utilisateur est orphanded. Je veux juste savoir quelles bases de données ont cet utilisateur et lesquelles ne le font pas.Trouver toutes les bases de données où un utilisateur particulier existe et son rôle

Disons que mon utilisateur s'appelle TestUser. Les bases de données qui ne contiennent pas cet utilisateur doivent renvoyer NULL.

Je voudrais que les résultats dans le format suivant:

Column1 - Database Name 

Column2 - UserName (if exists or else NULL) 

Column3 - UserRole (if exists or else NULL) 

Répondre

0

En supposant que vous ne cherchez pas à l'émission de 1000, une solution sélectionne (très laid) serait:

SELECT 'DB_1' , UserName , UserRole 
    FROM DB_1.UsersTable 
WHERE Username = 'TestUser' 

UNION 

SELECT 'DB_2' , UserName , UserRole 
    FROM DB_2.UsersTable 
WHERE Username = 'TestUser' 

: 
: 

Une autre solution consiste à utiliser SQL dynamique:

  1. Collect la liste de tous les blocs de données que vous de vérifier,
  2. Créez une chaîne hébergeant une instruction select comme celle ci-dessus,
  3. Exécutez l'instruction.

Encore une fois, les deux méthodes sont honteuses.

0
create table #temp 
(
dbname sysname, 
dbrole sysname, 
dbuser sysname 
) 

Exec sp_msforeachdb ' 
if db_id()>4 
Begin 

insert into #temp 
select db_name(), rp.name as database_role, mp.name as database_user 
from sys.database_role_members drm 
join sys.database_principals rp on (drm.role_principal_id = rp.principal_id) 
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id) 

End 
' 

Les rôles partie est référencée à partir d'ici:
Get list of all database users with specified role