遇到这个错误提示时,建议先不要急于重启服务,而是按步骤逐一排查。错误信息十分清晰:执行ALTER DATABASE时,系统无法在目标数据库上获取锁,从而导致操作失败。这通常意味着该数据库正在被其他会话占用,或者存在尚未提交的事务正在运行。

对应的中文报错为:消息5601,级别16,状态1,第1行,由于无法在数据库 'TestNonContainedDB' 上放置锁,ALTER DATABASE 失败。请稍后再试。消息5069,级别16,状态1,第1行,ALTER DATABASE 语句失败。英文版同样如此:Msg 5061, Level 16, State 1, Line 1 ALTER DATABASE failed because a lock could not be placed on database 'TestNonContainedDB'. Try again later. Msg 5069, Level 16, State 1, Line 1 ALTER DATABASE statement failed.
那么,该如何解决这个 SQL Server 锁冲突问题呢?核心思路是优先终止占用该数据库连接的所有会话。这里提供一个常用的 T-SQL 脚本,用它来清理指定库上的所有活动连接:
declare @kill varchar(8000) = '';
select @kill=@kill+'kill '+convert(varchar(5),spid)+';'
from master..sysprocesses
where dbid=db_id('WSS_Content_81');
exec (@kill);
请务必将脚本中的数据库名替换为你自己的实际数据库名称。执行完这段脚本后,再次运行ALTER DATABASE命令,通常就能顺利完成了。这是一个非常实用的应急方法,强烈建议收藏备用,方便后续遇到类似锁等待问题时快速处理。
