如何从匹配给定名称的服务器上的所有数据库中删除特定安全用户?

时间:2014-08-27 16:03:49

标签: sql sql-server sql-server-2005

我有类似的设置:

  
      
  • SQL-2005-SRVR   
        
    • 安全   
          
      • MYAPP_LOGIN
      •   
    •   
    • 数据库1   
          
      • 安全   
            
        • MYAPP_USER
        •   
        • OTHERUSER
        •   
      •   
    •   
    • 的Database2   
          
      • 安全   
            
        • OTHERUSER
        •   
      •   
    •   
    • 数据库3   
          
      • 安全   
            
        • MYAPP_USER
        •   
        • TESTUSER
        •   
      •   
    •   
    • Database4   
          
      • 安全   
            
        • MYAPP_USER
        •   
      •   
    •   
    • Database5   
          
      • 安全   
            
        • OTHERUSER
        •   
        • TESTUSER
        •   
      •   
    •   
  •   

我试图弄清楚如何编写一个SQL脚本,它将从服务器上的所有数据库中删除所有匹配MYAPP_USER的用户。我不熟悉如何在单个脚本中迭代多个数据库,甚至不知道如何查询用户是否存在于该数据库中。另外,我不确定这个脚本将从哪个上下文/目录运行 - mastermsdbmodel

在上面的示例中,Database1Database3Database4都会删除名为MYAPP_USER的用户。

我还需要从服务器本身删除登录,但我知道这就像DROP LOGIN MYAPP_LOGIN一样简单。

该脚本将作为服务器管理员运行,因此权限不是问题。

如何删除每个数据库中与名称MYAPP_USER匹配的所有用户?

2 个答案:

答案 0 :(得分:2)

您可以使用未记录的过程sp_MSforeachdb,通过将master.sys.server_principals加入sys.database_principals(并过滤sql server登录名)来检查数据库用户是否存在,然后删除用户如果找到。链接到MYAPP_LOGIN的用户将被删除,即使它没有明确命名为MYAPP_USER

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 
    DECLARE @Tsql NVARCHAR(MAX)
    SET @Tsql = ''''

    SELECT @Tsql = ''DROP USER '' + d.name
    FROM sys.database_principals d
    JOIN master.sys.server_principals s
        ON s.sid = d.sid
    WHERE s.name = ''MYAPP_LOGIN''

    EXEC (@Tsql)
'
GO

注意 如果从Windows创建SQL Server登录,请将MYAPP_LOGIN替换为YourDomain\\ADUser(是的,它是双重斜杠)。

答案 1 :(得分:2)

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 
begin try
  drop user [<put a name in here>]
  print ''did drop at ?''
end try
begin catch
  print ''did not drop at ?''
end catch
'
GO

方式更容易。你可以知道它在哪里工作。