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

SQL Server 2016如何删除sys.messages中35100系统消息实现自定义异常

SQL Server 2016自定义小于50000错误号抛出方案

核心结论:无法删除sys.messages中的35100系统消息

SQL Server 2012及之后版本对系统元数据的保护机制大幅收紧,你之前在SQL Server 2008上修改系统消息的操作属于非官方支持的高危操作,在2016环境中已经完全无法复现:

  • 隐藏资源数据库mssqlsystemresource为完全只读状态,哪怕使用专用管理员连接(DAC)也无法修改内部存储的系统消息表
  • sp_configure 'allow updates'选项从SQL Server 2008开始就已废弃,仅保留语法兼容性,不会实际开放系统表修改权限
  • 强制修改系统元数据会导致实例不稳定、升级失败,且不在微软官方支持范围内,不建议继续尝试该路径

可行落地方案

方案1:开启跟踪标记(零代码修改,临时过渡)

直接开启SQL Server未公开跟踪标记2784,即可绕过THROW语句的错误号范围校验,不会触发35100错误,完全兼容你现有代码的调用方式:

-- 实例级别永久开启跟踪标记,重启实例也会生效
DBCC TRACEON(2784, -1);
GO

开启后直接执行你原有的THROW语句,即可得到预期输出:

Msg 19175, Level 16, State 1, Line 21
19175|WARNING - Confirm Update ; Error = 19175

注意:该跟踪标记属于微软未公开功能,仅适合迁移过渡阶段临时使用,长期稳定运行建议选择方案2。

方案2:自定义存储过程(长期稳定,几乎无改造成本)

该方案为官方支持的标准方案,不需要修改业务逻辑,仅需一次批量替换即可:

  1. 在业务库创建自定义异常抛出存储过程,参数完全适配你现有THROW的传参规则:
CREATE PROCEDURE dbo.ThrowCustom
    @ErrorNumber INT,
    @Message NVARCHAR(4000),
    @State INT
AS
BEGIN
    SET NOCOUNT ON;
    RAISERROR(@Message, 16, @State);
END
GO
  1. 用正则匹配批量替换所有代码中的Throw 语句为EXEC dbo.ThrowCustom ,匹配规则可参考:
    • 匹配规则:Throw\s+(\d+)\s*,\s*'([^']+)'\s*,\s*(\d+)
    • 替换规则:EXEC dbo.ThrowCustom $1, '$2', $3
      整个替换过程可对全量代码文件批量执行,不需要手动修改任何业务逻辑,改造耗时不超过10分钟,输出效果完全符合预期。

内容的提问来源于stack exchange,提问作者raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:15:01