You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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删除时需要清理关联但出问题。可以先撤销权限再删用户:

  1. 先查询该用户关联的所有外部库(在目标数据库中执行):
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 = '[要删除的用户名]';
  1. 对查询到的每个外部库执行撤销权限:
USE [你的数据库名];
REVOKE ALL ON EXTERNAL LIBRARY::[外部库名] FROM [要删除的用户名];
  1. 最后执行删除用户命令:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:47:34