当有很多用户时,DROP USER 花费的时间太长

Cra*_*ein 11 security sql-server

在具有足够 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
Run Code Online (Sandbox Code Playgroud)

问题不是来自游标;这是实际DROP USER需要长达 5 秒的时间。

使用sp_whoisactive,wait_type 是NULL

在此处输入图片说明

不要注意持续时间,DROPCREATE USER正在WHILE循环运行,这就是为什么它说超过一分钟。

Profiler 显示要执行的读取次数超过 125,000 DROP USER

未启用服务代理。

Cra*_*ein 6

这个问题的解决方案是在数据库上启用服务代理。

ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

为数据库启用服务代理后,删除用户几乎是即时的。

Kin 在之前的评论中询问是否启用了服务代理,这让我朝着正确的方向进行了搜索。