0

我有一个包含 1000 多个数据库的巨大实例。我需要找到一种方法来查询整个实例并找到包含特定用户以及该用户具有什么角色的数据库。我对用户是否是孤儿不感兴趣。我只想知道哪些数据库有这个用户,哪些没有。

假设我的用户称为 TestUser。不包含此用户的数据库应返回 NULL。

我想要以下格式的结果:

Column1 - Database Name

Column2 - UserName (if exists or else NULL)

Column3 - UserRole (if exists or else NULL)
4

2 回答 2

0

假设您不是在寻找发布 1000 多个选择,一个(非常丑陋的)解决方案是:

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'

:
:

另一种解决方案是使用 DYNAMIC SQL:

  1. 收集您要检查的所有数据库的列表,
  2. 构建一个包含上述 select 语句的字符串,
  3. 执行语句。

同样,这两种方法都是可耻的。

于 2016-11-30T13:06:43.843 回答
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
'

从这里引用角色部分:
获取具有指定角色的所有数据库用户的列表

于 2016-11-30T13:24:23.050 回答