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
。
不要注意持续时间,DROP
和CREATE USER
正在WHILE
循环运行,这就是为什么它说超过一分钟。
Profiler 显示要执行的读取次数超过 125,000 DROP USER
。
未启用服务代理。
这个问题的解决方案是在数据库上启用服务代理。
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)
为数据库启用服务代理后,删除用户几乎是即时的。
Kin 在之前的评论中询问是否启用了服务代理,这让我朝着正确的方向进行了搜索。
归档时间: |
|
查看次数: |
1999 次 |
最近记录: |