SQL Server触发器中TRY CATCH仅捕获可恢复的运行时错误如除零、类型转换失败无法捕获编译期错误表/列不存在或终止性错误外键、唯一约束冲突日志记录需用极简可靠表存在性检查独立存储过程封装并避免二次异常。SQL Server触发器里TRY CATCH不生效因为触发器运行在隐式事务中而 TRY CATCH 无法捕获编译期错误比如表不存在、列名拼错也不能跨批处理捕获某些运行时错误如违反约束导致的终止性错误。只有可恢复的运行时错误如除零、转换失败才能被 CATCH 捕获。实操建议把关键逻辑包在 BEGIN TRY ... END TRY 内但别指望它能兜住所有异常避免在 CATCH 块里再写可能出错的操作比如往同一张日志表插数据而该表恰好被锁或字段不匹配优先用 ERROR_NUMBER()、ERROR_MESSAGE()、ERROR_LINE() 获取上下文别只记 GETDATE()如果触发器修改了多张表且某步失败后需回滚全部得显式加 IF TRANCOUNT 0 ROLLBACK TRANSACTION记录日志时INSERT失败怎么办最常见的情况是触发器报错 → 进入 CATCH → 尝试往 error_log 表写日志 → 结果日志表本身不可写权限不足、字段类型不匹配、触发器递归触发导致二次失败并中断流程。实操建议日志表必须设计为“极简可靠”至少包含 idIDENTITY、error_timeDATETIME2、error_numberINT、error_messageNVARCHAR(4000)、proc_nameNVARCHAR(128)插入日志前加 IF OBJECT_ID(dbo.error_log) IS NOT NULL 判断避免对象不存在直接崩用 INSERT INTO ... SELECT 而非 VALUES避开参数类型推导引发的隐式转换失败考虑用 sp_executesql 包裹日志插入并在外层再套一层 TRY CATCH —— 但这会增加嵌套复杂度慎用触发器中调用存储过程记录日志是否更安全是的把日志逻辑抽成独立存储过程如 usp_log_error能隔离风险、复用代码、方便测试。但要注意调用方式和事务上下文。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。