在具有足够 RAM 和快速磁盘的 SQL Server 2014 实例上,有超过 160 个用户可以访问数据库。由于某种我不知道的原因,DROP USER [username]
在这个数据库中运行命令每个用户最多需要 5 秒。
将用户重新映射到登录名并恢复他们的权限非常快。
在从生产中刷新 DEV 数据库的上下文中,我必须删除并重新创建所有数据库用户。所以是的,删除数据库用户并重新创建它们是必要的。
如何加快DROP USER
命令速度?
请记住,对于我正在写的实例,我必须运行它超过 160 次。
这是我正在使用的 SQL:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql
END CATCH
FETCH NEXT FROM drop_user_cur INTO @user
END
CLOSE drop_user_cur
DEALLOCATE drop_user_cur
问题不是来自光标;这是实际DROP USER
最多需要 5 秒的时间。
使用sp_whoisactive
,wait_type 是NULL
。
不要注意持续时间,DROP
并且CREATE USER
正在WHILE
循环运行,这就是为什么它说超过一分钟的原因。
Profiler 显示要执行的读取超过 125,000 次DROP USER
。
未启用服务代理。
解决此问题的方法是在数据库上启用服务代理。
在为数据库启用服务代理后,删除用户几乎是瞬间完成的。
Kin 在之前的评论中询问是否启用了服务代理,这让我朝着正确的方向搜索。
这不是问题的答案,而是完全驳回它的论据。
如果我正确理解您的评论:
您的目标是将生产数据复制到开发系统上,并使用与生产系统相同的权限,使用相同的用户名使其工作。
最快的方法是使用本知识库文章中 ms 描述的过程将 sql 登录从生产系统克隆到开发系统。
使用 ms 定义的过程,结果是您可以恢复开发服务器上的数据库,并且权限无需更改即可正常工作。
我成功地使用上述过程将 sql 2005 生产环境复制到测试和开发 sql 2012 环境中。
克隆用户后,一个简单的数据库恢复将我引导到一对具有最新数据的完全正常工作的新系统。
该解决方案的巨大优势在于,要刷新开发数据,您只需恢复生产数据库即可;仅此而已;您将不得不调整引用、同义词等,但权限不会被破坏。
以下是文章中的代码,仅供参考,但请参考文章,其中包含有关与古代sql版本的兼容性的备注和详细信息,密码加密详细信息以及其他信息,可能会让您在跨服务器传输登录时感到头疼:
与此类似的游标应该可以工作