在论坛中出现的比较难的sql问题:20(触发器专题2)
原文:在论坛中出现的比较难的sql问题:20(触发器专题2)
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
本篇是触发器专题,有很多触发器的问题。
1、关于触发器中回滚的问题。
在官方文档http://technet.microsoft.com/zh-cn/library/ms181299.aspx中“互操作性”段落中有这么一句:
触发器继续执行 ROLLBACK 语句之后的所有其余语句。 如果这些语句中的任意语句修改数据,则不回滚这些修改。 执行其余的语句不会激发嵌套触发器。
其中“执行其余的语句不会激发嵌套触发器”,是否意味着在回滚操作后面的语句如果继续执行的话,后面语句触发的触发器就不会执行了。比如后面的语句有针对一个表的update操作,而这张表又有update的触发器,这个时候update会执行成功,但触发器不会执行?
但是很奇怪,我做了一个实验,发现,即使是嵌套触发器,也能够被触发,和微软文档上说的不一样。
从下面的insert时的输出,可以看出,在触发器中rollback之后的语句,是可以执行的,另外,update另一个表的操作也执行成功,并且触发了触发器。
-
--drop table t1
-
--drop table t2
-
-
create table t1(id int)
-
create table t2(id int)
-
-
insert into t2
-
values(100)
-
go
-
-
create trigger dbo.trigger_t1
-
on t1
-
for insert
-
as
-
-
rollback;
-
-
select '这是rollback之后的语句,这里能执行'
-
-
update t2
-
set id = 1;
-
go
-
-
-
-
create trigger dbo.trigger_t2
-
on t2
-
for update
-
as
-
-
select '这是t2的update触发器,这里能执行'
-
-
go
-
-
-
--插入数据
-
insert into t1
-
values(1)
-
/*
-
这是rollback之后的语句,这里能执行
-
-
这是t2的update触发器,这里能执行
-
-
消息 3609,级别 16,状态 1,第 3 行
-
事务在触发器中结束。批处理已中止。
-
*/
-
-
--没有记录
-
select * from t1
-
-
-
select * from t2
-
/*
-
id
-
1
-
*/
2、触发器的错误处理
http://bbs.csdn.net/topics/390637035
我在A表写了个触发器 插入后执行,是向B表插入一条记录
-
USE [test]
-
GO
-
SET ANSI_NULLS ON
-
GO
-
SET QUOTED_IDENTIFIER ON
-
GO
-
ALTER TRIGGER [dbo].[tba_delete]
-
ON [dbo].[tba]
-
AFTER INSERT
-
AS
-
BEGIN
-
SET NOCOUNT ON;
-
insert into test.dbo.tbb(title,info) values('title','info');
-
END
在A表插入数据后正常。当我把 语言改为:
insert into test.dbo.tbb(id,title,info) values(1,'title','info');
故意出错。问题出现了,当触发器内的语句出错,向A表插入的数据就不能成功插入。
向朋友们求教个问题。我要如何把触发器中的出错信息记录下来?或者在什么地方可以查看到触发器执行时是否出错了,及查看错误的信息?
我的解法:
-
USE [test]
-
GO
-
-
SET ANSI_NULLS ON
-
GO
-
-
SET QUOTED_IDENTIFIER ON
-
GO
-
-
-
create table [tba](title varchar(20),info varchar(20))
-
-
create table tbb(title varchar(20),info varchar(20))
-
-
-
--创建一个存放错误信息的表
-
create table tb_error_message
-
(
-
obj_name nvarchar(30),
-
obj_type nvarchar(15),
-
err_msg nvarchar(100),
-
err_date datetime
-
)
-
go
-
-
drop trigger tba_delete
-
go
-
-
create TRIGGER [dbo].[tba_delete]
-
ON [dbo].[tba]
-
AFTER INSERT
-
AS
-
BEGIN
-
SET NOCOUNT ON;
-
-
begin try
-
--这里模拟插入title列的数据长度,超过了定义时的20
-
insert into test.dbo.tbb(title,info) values('title1111111111111111111','info');
-
end try
-
-
begin catch
-
--错误了就回滚
-
rollback;
-
insert into tb_error_message
-
values('tba_delete','trigger',error_message(),getdate())
-
-
end catch
-
-
END
-
go
-
-
insert into tba
-
values('11','11')
-
/*
-
消息 3930,级别 16,状态 1,过程 tba_delete,第 16 行
-
当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。
-
语句已终止。
-
*/
-
-
-
--查询出错的信息
-
select *
-
from tb_error_message
-
/*
-
obj_name obj_type err_msg err_date
-
tba_delete trigger 将截断字符串或二进制数据。 2013-11-08 12:32:16.750
-
*/
3、忽略触发器中的错误
http://bbs.csdn.net/topics/390623172
我的情况是这样的: 当向A表插入数据时,需要向某用户发送信息通知,由于插入数据方是第三方软件做的,我控件不了,所以我在A表加个触发器来实现,现在问题是发送信息这里的错误是可以忽略的,就是说假如发送失败不影响数据的插入,请问我在触发器里如何忽略错误,让事务继续执行.
我的思路是:
-
--先保存一个事务点
-
SAVEPOINT xxx
-
-
begin try
-
--或者是调用存储过程,或者就直接写代码
-
exec 发送信息的存储过程
-
end try
-
begin catch
-
select '执行失败'
-
--一旦出错,只是回滚到上面的事务点,继续执行
-
ROLLBACK [WORK] TO SAVEPOINT xxx
-
end catch
-
-
--其他代码
在论坛中出现的比较难的sql问题:20(触发器专题2)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- 数据库中的union与union all的区别
Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All 两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...
- 20161209pod search 'fmdb'提示[!] Unable to find a pod with name, author, summary, or description matching `fmdb`
从SVN上更新工程之后运行工程提示错误: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update y ...
- git pull There is no tracking information for the current branch.
在高版本的 git下面,也许会看见这样的提示: 解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系. 比如我们设置master对应远程仓库的master分支 git branch - ...
- C++11智能指针之std::unique_ptr
C++11智能指针之std::unique_ptr uniqut_ptr是一种对资源具有排他性拥有权的智能指针,即一个对象资源只能同时被一个unique_ptr指向. 一.初始化方式 通过new云 ...
- python-learning-第二季-数据处理numpy
https://www.bjsxt.com/down/8468.html numpy-科学计算基础库 例子: import numpy as np #创建数组 a = np.arange() prin ...
- nginx调优(二)
nginx调优(一) (1).Fastcgi调优 FastCGI全称快速通用网关接口(FastCommonGatewayInterface),可以认为FastCGI是静态服务和动态服务的一个接口.Fa ...
- Go并发编程实战 第2版 PDF (中文版带书签)
Go并发编程实战 第2版 目录 第1章 初识Go语言 1 1.1 语言特性 1 1.2 安装和设置 2 1.3 工程结构 3 1.3.1 工作区 3 1.3.2 GOPATH 4 1.3.3 源码文件 ...
- 【源码解析】Flink 滑动窗口数据分配到多个窗口
之前一直用翻滚窗口,每条数据都只属于一个窗口,所有不需要考虑数据需要在多个窗口存的事情. 刚好有个需求,要用到滑动窗口,来翻翻 flink 在滑动窗口中,数据是怎么分配到多个窗口的 一段简单的测试代码 ...
- LintCode: coins in a line I
有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? n = 1, 返回 true.n = 2, ...
- 07点睛Spring MVC4.1-ContentNegotiatingViewResolver
转发地址:https://www.iteye.com/blog/wiselyman-2214965 7.1 ContentNegotiatingViewResolver ContentNegotiat ...
