更改多个安全帐户的角色

时间:2010-10-20 10:25:47

标签: sql-server

我在sql数据库上有很多安全帐户,我希望根据简单的字符串比较删除/添加角色。

  1. 基本上我想列出所有 帐户
  2. 过滤掉不开始的帐户 使用“MyDomain”
  3. 删除角色A.
  4. 添加角色B.
  5. 我现在发现的是,我使用sp_helprolemember列出了所有帐户以及sp_addrolemembersp_droprolemember。我的问题是我不知道如何“获取”sp_helprolemember的输出并使用它。

    我第一次根据反馈意见解决问题。

    DROP TABLE [dbo].[XTemp]
    create table XTemp(DbRole sysname,MemberName sysname,MemberSID varbinary(85) )
    
    insert XTemp exec sp_helprolemember 
    select * from XTemp
    

    我制作了一个永久表,以便更简单地进行测试和调试。

    SELECT [DbRole]
          ,[MemberName]
          ,[MemberSID]
      FROM [ARTICLE].[dbo].[XTemp]
      WHERE MemberName like Domain\%'
        exec sp_addrolemember 'OldRole MemberName
    

2 个答案:

答案 0 :(得分:2)

假设您正在使用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提取到表中的数据不再是最新的,并且可能应该刷新。

答案 1 :(得分:0)

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

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