【问题标题】:Find all databases where particular user exists and its role查找存在特定用户及其角色的所有数据库
【发布时间】:2016-11-30 12:54:30
【问题描述】:

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

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

我想要以下格式的结果:

Column1 - Database Name

Column2 - UserName (if exists or else NULL)

Column3 - UserRole (if exists or else NULL)

【问题讨论】:

    标签: sql tsql sql-server-2012 system-tables


    【解决方案1】:

    假设您不希望发布 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. 执行语句。

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

    【讨论】:

      【解决方案2】:
      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
      '
      

      角色部分引用自这里:
      Get list of all database users with specified role

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-06
        • 2017-11-02
        • 2020-09-03
        • 2015-09-09
        • 1970-01-01
        • 2017-09-19
        • 2012-10-26
        • 1970-01-01
        相关资源
        最近更新 更多