Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更改多个安全帐户的角色_Sql Server - Fatal编程技术网

Sql server 更改多个安全帐户的角色

Sql server 更改多个安全帐户的角色,sql-server,Sql Server,我在sql数据库上有许多安全帐户,我想通过简单的字符串比较来删除/添加角色 基本上我想列出所有 帐目 筛选出未启动的帐户 使用“MyDomain\” 删除角色A 添加角色B 现在我发现我用它列出了所有的帐户和。我的问题是,我不知道如何从中“获取”输出并使用它 我的第一次尝试是基于反馈的解决方案 DROP TABLE [dbo].[XTemp] create table XTemp(DbRole sysname,MemberName sysname,MemberSID varbinary(85)

我在sql数据库上有许多安全帐户,我想通过简单的字符串比较来删除/添加角色

  • 基本上我想列出所有 帐目
  • 筛选出未启动的帐户 使用“MyDomain\”
  • 删除角色A
  • 添加角色B
  • 现在我发现我用它列出了所有的帐户和。我的问题是,我不知道如何从中“获取”输出并使用它

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

    DROP TABLE [dbo].[XTemp] create table XTemp(DbRole sysname,MemberName sysname,MemberSID varbinary(85) ) insert XTemp exec sp_helprolemember select * from XTemp 删除表[dbo].[XTemp] 创建表XTemp(DbRole sysname、MemberName sysname、MemberSID varbinary(85)) 插入XTemp exec sp_helprolember 从XTemp中选择* 我制作了一个永久表,以简化测试和调试

    SELECT [DbRole] ,[MemberName] ,[MemberSID] FROM [ARTICLE].[dbo].[XTemp] WHERE MemberName like Domain\%' exec sp_addrolemember 'OldRole MemberName 选择[DbRole] ,[MemberName] ,[MemberSID] 来自[文章].[dbo].[XTemp] 其中MemberName类似于域\%' exec sp_addrolemember的旧角色成员名
    假设您使用的是SQL 2005或更高版本,并且在不带参数的情况下执行
    sp\u helprolember
    ,这就是运行
    sp\u helprolember
    的查询(使用
    sp\u helptext
    提取):

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

    如果您希望坚持记录的行为,可以将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\u helprolemember
    提取到表中的数据不再是最新的,可能需要刷新。

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

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

  • 谢谢,这似乎是朝着正确的方向发展。但是我不知道如何“使用它”我的尝试是这样的:(我在测试时存储在“真实”表中)@EKS-我建议您编辑问题,将添加到pastebin的片段和您的问题包括在内-它将帮助问题的未来用户
    DECLARE @sql NVARCHAR(MAX),
    
    SELECT @sql = 'EXEC sp_addrolemember ''OldRole'', ''' + MemberName + ''''
    FROM #t
    WHERE MemberName LIKE 'Domain\%' 
    
    EXEC sp_executesql @stmt = @sql