Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...
在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目数据库的脚本还是可以操作的,那就在数据流的必经之路上拦截数据处理业务就是了,于是决定在一张业务表上加一个触发器,关于触发器的基础这里就不多说了,网上一搜一大堆,其实就是一张表的数据行被操作以后会针对被操作的数据行执行一段存储过程脚本,只不过这个存储过程比较特殊罢了,是专门侦听对表的操作然后由系统调用的而已……
只要用触发器肯定会操作inserted和deleted两张表,大家切记在写t-sql业务操作之前一定要判断这两张虚表中是不是有数据,如果不判断直接往下执行就有可能报“在触发器执行过程中引发了错误,批处理已中止,用户事务(如果有)已回滚”的错误,本人就吃了一个这样的亏;触发器刚加上前几天运行的挺正常,等过几天发现有些针对这张业务表执行其它业务操作一执行就报前面所说的错误,查了n久发现业务操作中执行了一个update语句,而这个update语句的where条件过滤后其实一条符合where条件的数据都没有,这样就导致执行触发器的时候 deleted和inserted两张虚表中是没有数据的,再操作下去就报错了,触发器一报错正常的原来好用业务也报错了……
解决方法很简单,在触发器的结尾加一个结束标签TheEnd,然后在触发器入口判断两张虚表(inserted和deleted)是否有数据,如果都没有数据直接跳转到结束标签TheEnd处不处理就是了,只有有数据的时候才执行业务处理,大概代码如下,看红色加粗部分:
create trigger [dbo].[Tgr_MyTable_InsertUpdate] --触发器名 on [dbo].[MyTable] --MyTable是实际业务表名for insert,update ASdeclare @IsUpdate bit; declare @IsInsert bit; declare @IsDelete bit;set @IsDelete=-1; set @IsInsert=-1; set @IsUpdate=-1;--这个判断很关键,如果没有数据那就别处理了,直接跳转到末尾 if not exists (select 1 from inserted) and not exists (select 1 from deleted) begingoto TheEnd; --TheEnd是脚本结尾处的结束标签 end else if exists (select 1 from inserted) and exists (select 1 from deleted) beginset @IsUpdate=1; -- 如果两张虚表都有数据表示执行的是update操作 end else if exists (select 1 from inserted) and not exists (select 1 from deleted) beginset @IsInsert=1; -- 只有inserted有数据表示是执行insert语句触发的 end else beginset @IsDelete=1; endbegin trydeclare @newValue varchar(100); declare @oldValue varchar(100);if @IsInsert=1 or @IsUpdate=1 begin--获取新修改的Name字段SELECT @tempValue = Name FROM inserted; beginif @IsUpdate=1 or @IsDelete=1 begin--获取修改或删除前的Name字段SELECT @oldValue = Name FROM deleted; end-- 其它业务处理......end try begin catchbegin trydeclare @Error varchar(200);set @Error='TgrError:'+cast(ERROR_LINE() as varchar)+'_' +isnull(ERROR_MESSAGE(),'');-- 将@Error的值可以记录到一个执行的日志表中end trybegin catchend catch end catchTheEnd:
就是这么简单,以上排查问题结果分享给其它小伙伴,希望大家别再走我的弯路
转载于:https://www.cnblogs.com/Taburensheng/p/9706102.html
Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...相关推荐
- Sql Server 2008卸载后再次安装一直报错
sql server 2008卸载之后再次安装一直报错问题. 第一:由于上一次的卸载不干净,可参照百度完全卸载sql server2008 的方式 1. 用WindowsInstaller删除所有与S ...
- SQL Server 合并复制遇到identity range check报错的解决
最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, State ...
- 解决SQL Server 导入System.Web.dll程序集,报错问题
本人由于需要做一个小项目,项目的内容是这样的:SQl Server中有个报警信息表(tb_Alarm_info),当这个报警信息表有新的数据插入时,将这个产生的报警信息发送到相关人员手机上: 解决思路 ...
- 因 inode 不足导致数据库登陆报错相关问题
墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,主要分享用数据泵导入数据时发生空间不足的问题 "No ...
- mysql字段超长会报错吗_MySQL使用过程中的报错处理(持续更新)
MySQL使用过程中的报错处理(持续更新) 一.数据库初始化 1.Percona的MySQL 5.6.20版本数据库初始化 初始化命令(MySQL 5.6版本不适用mysqld命令进行初始化) ./s ...
- 解决在安装Symantec选择SQL 数据库“11501”报错
问题: symantec(赛门铁克)安装时,不用内嵌数据库,用SQL,出现"错误 11501无法连接到数据库.如图所示: 解决思路: 1.排查防火墙是否关闭 2.主要排查SQL Server ...
- SQL Server 2008高可用性系列:数据库快照
SQL Server 2008高可用性系列:数据库快照 http://database.51cto.com 2010-09-13 14:45 我爱菊花 博客园 我要评论(0) 摘要:我们今天要 ...
- SQL Server修改表结构后批量更新所有视图
--获取指定SQLServer数据库所有表及视图的字段列表及类型.长度 Select o.Name As ObjectsName , c.name As ColumnsName , t.name As ...
- SQL Server 备份与恢复之八:还原数据库
本文主要来源于Microsoft<SQL Server 2008 R2联机丛书>.转裁请注明出处. 一.还原用户数据库 1."还原数据库"基本操作 (1)目标数据库 在 ...
最新文章
- 一行代码卖出 570 美元, 天价代码的内幕
- 傅里叶分析中的时频域之间的关系(以及一点对于DFT的一点思考)
- 零基础自学python看什么书-零基础想要学习Python编程 ,不知道看哪本书?
- hocon配置文件_GitHub - Himmelt/Hocon: Simple Hocon Configuration Library [轻量 Hocon 配置库]...
- C#LeetCode刷题-贪心算法
- Java基础学习总结(56)——学Java必知十大学习目标
- 每天学一点flash(70)弹出和关闭窗口
- Idea导出可运行Jar包
- 基于halcon的颜色识别---杜邦线识别
- IDEA Maven配置,Tomcat配置
- 在输入框输入时限制输入框只能输入正整数以及两位小数正则表达式
- 数据防泄漏加密保护方案笔记
- elasticsearch + ik
- 前端面试经典题目合集--77题
- macOS - afconvert 命令(音频格式转换)
- 英语几个常见从句类型(复习)
- 为什么不使用多线程?
- Unity数据持久化——Json
- 红帽linux6.4安装教程,RedHat6.4图文安装教程---Minimal版(详细版)
- L1-014 简单题 - java
热门文章
- poj2154-color-polyan次二面体+欧拉函数优化
- Windows Phone 7编程学习点滴一——页面切换、返回键重载和工具栏
- PL/SQL第五章 Order by排序
- Resin介绍及其使用配置
- 20140725 快速排序时间复杂度 sTL入门
- asp.net 2.0中用GRIDVIEW插入新记录
- 跨平台PHP调试器设计及使用方法——拾遗
- 主成分分析(PCA)简介
- 【Cmake】执行cmake命令时报错:No XSLT processor found
- 【leetcode】力扣刷题(2):两数相加(go语言)