【问题标题】:Change the roles of multiple security accounts更改多个安全帐户的角色
【发布时间】:2010-10-20 21:16:33
【问题描述】:

我在 sql 数据库上有许多安全帐户,我想根据简单的字符串比较为它们删除/添加角色。

  1. 基本上我想列出所有 帐户
  2. 过滤掉不启动的帐户 使用“我的域”
  3. 删除角色 A。
  4. 添加角色 B。

我现在发现的是我使用sp_helprolemember 列出所有帐户以及sp_addrolemembersp_droprolemember。我的问题是我不知道如何“获取”来自sp_helprolemember 的输出并使用它。

我第一次尝试基于反馈的解决方案。

删除表 [dbo].[XTemp] 创建表 XTemp(DbRole sysname,MemberName sysname,MemberSID varbinary(85) ) 插入 XTemp exec sp_helprolemember 从 XTemp 中选择 *

我制作了一个永久表以使其更易于测试和调试。

选择 [DbRole] ,[成员名字] ,[会员ID] 来自 [文章].[dbo].[XTemp] WHERE MemberName like Domain\%' exec sp_addrolemember '旧角色成员名称

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    假设您使用的是 SQL 2005 或更高版本,并且不带参数执行sp_helprolemember,这是sp_helprolemember 运行的查询(使用sp_helptext 提取):

      select DbRole = g.name, MemberName = u.name, MemberSID = u.sid  
       from sys.database_principals u, sys.database_principals g, sys.database_role_members m  
       where   g.principal_id = m.role_principal_id  
        and u.principal_id = m.member_principal_id  
       order by 1, 2  
    

    这应该使您能够将所需的信息收集到临时表中。

    如果您更愿意坚持记录在案的行为,可以将 SP 的输出存储到临时表中:

    create table #t
    (DbRole sysname,
    MemberName sysname,
    MemberSID varbinary(85) 
    )
    
    insert #t
    exec sp_helprolemember 
    
    select * from #t
    

    编辑

    有两种方法可以使用这些数据来修改您的系统。一种是使用游标:

    DECLARE @memberName sysname
    
    DECLARE curMember CURSOR fast_forward FOR
    SELECT  MemberName
    FROM #t 
    WHERE MemberName LIKE 'Domain\%' 
    
    OPEN curMember
    
    FETCH NEXT FROM curMember INTO @memberName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        EXEC sp_addrolemember 'OldRole', @memberName
        FETCH NEXT FROM curMember INTO @memberName
    
    END
    
    CLOSE curMember
    DEALLOCATE curMember
    

    另一个是使用动态SQL:

    DECLARE @sql NVARCHAR(MAX),
    
    SELECT @sql = 'EXEC sp_addrolemember ''OldRole'', ''' + MemberName + ''''
    FROM #t
    WHERE MemberName LIKE 'Domain\%' 
    
    EXEC sp_executesql @stmt = @sql
    

    如您所见,动态 SQL 版本更紧凑,但需要更多的维护工作。

    请记住,在执行任一语句后,您从 sp_helprolemember 提取到表中的数据不再是最新的,可能应该刷新。

    【讨论】:

    • 谢谢,这似乎是朝着正确的方向发展。但我不知道如何“使用它”我的尝试是这样的:ampaste.net/f3bac866d(我在测试时存储在一个“真实”表中)
    • @EKS - 我建议您编辑问题以包含您添加到 pastebin 的 sn-p 和您的问题 - 这将有助于该问题的未来用户
    【解决方案2】:

    您可以使用 Excel 生成 SQL 查询 - 我知道这听起来很蹩脚,但它非常简单且功能强大。它特别适合必须执行一次或仅不时执行的任务。

    1. 将结果从 Management Studio 复制到 Excel。
    2. 删除不需要的行和列。
    3. 使用 B 列中的公式(例如="EXEC sp_dropsrvrolemember '"&A1&"', 'sysadmin'")为存储在 A 列中的值生成查询(该公式当然可以使用输入数据引用多个列并生成非常复杂的查询)。
    4. 将生成的查询从 Excel 复制到 Management Studio。

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 1970-01-01
      • 2015-11-13
      • 2020-10-28
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多