SQL Server 2019删除数据库用户触发外部库文件夹错误的解决方法咨询
解决SQL Server 2019删除用户时的External Libraries报错问题
我之前在处理启用了Machine Learning Services and Language Extensions的SQL Server 2019实例时,也碰到过一模一样的报错——删除数据库用户后,日志里出现Couldn't remove the user (n) from database (n) from the external libraries folder, error: 0x80070003。这个错误本质是SQL Server尝试清理External Libraries文件夹中该用户的关联文件时,找不到路径或者权限不足导致的(0x80070003就是系统"找不到指定路径"的错误代码)。下面是几个我亲测有效的解决方法:
方法1:手动清理External Libraries文件夹的用户残留
SQL Server的外部库文件默认存储在这个路径(记得替换实例名和数据库名):
C:\Program Files\Microsoft SQL Server\MSSQL15.<你的实例名>\MSSQL\ExternalLibraries\<目标数据库名>
- 进入对应数据库的文件夹,里面会以用户名命名子目录
- 手动删除该用户的专属子目录
- 重新执行删除用户的操作,此时日志就不会再报这个错了
方法2:删除用户前先撤销外部库权限
有时候用户被授予了外部库的权限,导致SQL Server删除时需要清理关联但出问题。可以先撤销权限再删用户:
- 先查询该用户关联的所有外部库(在目标数据库中执行):
USE [你的数据库名]; SELECT el.name AS ExternalLibraryName FROM sys.database_principals dp JOIN sys.database_permissions dpms ON dp.principal_id = dpms.grantee_principal_id JOIN sys.external_libraries el ON dpms.major_id = el.external_library_id WHERE dp.name = '[要删除的用户名]';
- 对查询到的每个外部库执行撤销权限:
USE [你的数据库名]; REVOKE ALL ON EXTERNAL LIBRARY::[外部库名] FROM [要删除的用户名];
- 最后执行删除用户命令:
DROP USER [要删除的用户名];
方法3:自动化清理脚本(适合批量操作)
如果需要批量处理多个用户,可以写个脚本整合清理步骤:
DECLARE @UserName NVARCHAR(128) = '[要删除的用户名]'; DECLARE @DBName NVARCHAR(128) = '[你的数据库名]'; DECLARE @ExternalLibraryName NVARCHAR(128); DECLARE @SQL NVARCHAR(MAX); -- 遍历该用户的所有外部库权限 DECLARE lib_cursor CURSOR FOR SELECT el.name AS ExternalLibraryName FROM sys.database_principals dp JOIN sys.database_permissions dpms ON dp.principal_id = dpms.grantee_principal_id JOIN sys.external_libraries el ON dpms.major_id = el.external_library_id WHERE dp.name = @UserName; OPEN lib_cursor; FETCH NEXT FROM lib_cursor INTO @ExternalLibraryName; WHILE @@FETCH_STATUS = 0 BEGIN -- 撤销权限 SET @SQL = N'USE ' + QUOTENAME(@DBName) + N'; REVOKE ALL ON EXTERNAL LIBRARY::' + QUOTENAME(@ExternalLibraryName) + N' FROM ' + QUOTENAME(@UserName) + N';'; EXEC sp_executesql @SQL; FETCH NEXT FROM lib_cursor INTO @ExternalLibraryName; END; CLOSE lib_cursor; DEALLOCATE lib_cursor; -- 删除用户 SET @SQL = N'USE ' + QUOTENAME(@DBName) + N'; DROP USER ' + QUOTENAME(@UserName) + N';'; EXEC sp_executesql @SQL;
执行完脚本后,再手动去External Libraries文件夹删除对应用户的子目录即可。
关键注意事项
- 操作前一定要备份数据库和External Libraries文件夹,避免误删重要文件
- 确保SQL Server服务账号对External Libraries文件夹有读写权限,否则即使手动删了,后续操作可能还会出问题
- 尽量不要临时禁用Machine Learning Services(通过
EXEC sp_configure 'external scripts enabled', 0; RECONFIGURE;),除非是紧急情况,因为这会影响依赖ML Services的业务
内容的提问来源于stack exchange,提问作者user13712765
相关产品推荐
相关产品推荐

