我有类似的设置:
- SQL-2005-SRVR
- 安全
- 的 MYAPP_LOGIN
- 数据库1
- 安全
- 的 MYAPP_USER
- OTHERUSER
- 的Database2
- 安全
- OTHERUSER
- 数据库3
- 安全
- 的 MYAPP_USER
- TESTUSER
- Database4
- 安全
- 的 MYAPP_USER
- Database5
- 安全
- OTHERUSER
- TESTUSER
我试图弄清楚如何编写一个SQL脚本,它将从服务器上的所有数据库中删除所有匹配MYAPP_USER
的用户。我不熟悉如何在单个脚本中迭代多个数据库,甚至不知道如何查询用户是否存在于该数据库中。另外,我不确定这个脚本将从哪个上下文/目录运行 - master
,msdb
,model
?
在上面的示例中,Database1
,Database3
和Database4
都会删除名为MYAPP_USER
的用户。
我还需要从服务器本身删除登录,但我知道这就像DROP LOGIN MYAPP_LOGIN
一样简单。
该脚本将作为服务器管理员运行,因此权限不是问题。
如何删除每个数据库中与名称MYAPP_USER
匹配的所有用户?
答案 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
方式更容易。你可以知道它在哪里工作。