在论坛中出现的比较难的sql问题:20(触发器专题2)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

本篇是触发器专题,有很多触发器的问题。


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  

--其他代码


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽 宁 工 业 大 学 《SQL server数据库设计实训》 报告 题目: 餐饮管理系统 院(系): 软件学院 专业班级: 电子商务(国际) 学 号: 学生姓名: 指导教师: 翟宝峰 教师职称: 副教授 起止时间:2011。09。03-2011。09。14 设计任务及评语 院(系):软件学院 教研室:软件教研室 "学 号 " "学生姓名 " "专业班级 "电子商务(国际)" "设计题目 " 餐饮管理系统 " " 设 计 任 务" " " " " " "要求根据管理信息系统及数据库设计原理,按照系统设计的步骤和规范,完成" " "各阶段的设计内容。 " " "需求分析具体实际,数据流图、数据字典、关系模型要规范。 " " "在sql server2000 " " "上实现数据库的模型建立(数据库、表的建立、完整性约束的实现、关系图 " " "、必要的存储过程及触发器的编程),并用VB实现简单的应用程序。 " " "设计过程,要严格遵守设计的时间安排,听从指导教师的指导。正确地完成" " "上述内容,规范完整地撰写出设计报告. " "指导教师评语" " "及成绩 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "成绩: 指导教师签字: " " " " " "2012 年09月17日 " 目 录 第1章 设计目的与要求 1 1。1设计目的 1 1.2设计环境 1 1.3主要参考资料 1 1.4设计内容及要求 1 第2章 设计内容 2 2。1数据库设计 2 2。1.1需求分析 2 2.1.2概念设计 5 2.1.3逻辑设计 6 2.1.4物理设计 7 2。1。5 数据库实现 7 2.2程序设计 11 2.2.1概要设计 11 2.2.2程序实现 11 第3章 设计总结 14 参考文献 15 第1章 设计目的与要求 1.1设计目的 本设计专题是软件工程类专业的有关管理信息系统设计开发的一个重要环节,是本专 业学生必须学习和掌握的综合实践课程. 本实践课的主要目的是:(1)、掌握运用管理系统及数据库原理知识进行系统分析和 设计的方法;(2)掌握关系数据库的设计方法;(3)掌握SQL Server 2000技术应用;(4)掌握简单的数据库应用程序编写方法;(5)理解C/S模式结构。 1。2设计环境 硬件:处理器,Intel Pentium 166 MHz以上,内存:512M 以上,硬盘空间:8G 以上 软件:Windows XP需要软件:Microsoft Visual Basic 6。0,Microsoft SQL Server 2000 1。3主要参考资料 1。《管理信息系统》 黄梯云 高等教育出版社 2。《数据库系统概论》 萨师煊 高等教育出版社 3。《SQL Server 2000 数据库应用系统开发技术》朱如龙编,机械工业出版社。 4。《SQL Server 2000 数据库应用系统开发技术实验指导》朱如龙编,机械工业出版社 4设计内容及要求 一、内容 1。要求根据管理信息系统及数据库设计原理,按照数据库系统设计的步骤和规范,完 成各阶段的设计内容。 2.需求分析具体实际,数据流图、数据字典、关系模型要正确规范 3.在sql server2000 上实现设计的数据库模型。 4.对应用程序进行概要设计。 5。用VB实现简单的应用程序编写。 二、要求 设计过程,要严格遵守课程设计的时间安排,听从指导教师的指导.正确地完成上述 内容,规范完整地撰写出课程设计报告。 第2章 设计内容 2。1数据库设计 本数据库系统通过之前的需求分析,以SQL为后台,VB为前台设计了一个简单的餐饮 管理系统.通过概念设计,逻辑设计和物理设计的转换来实现了数据库文件。 2。1.1需求分析 本系统介绍了一般的计算机管理的餐饮服务程序,首先从各种相关的软件入手,分析 了这类软件的特点、发展历程,并对发展缓慢的原因进行了初步的调研。从以前的相关 软件的软肋着手,介绍了餐饮服务计算机软件的编程思路和基本方法。重点介绍了前台 营业,从第三者的角度即消费者的角度介绍了前台营业的操作流程 在酒店里建立一个餐饮服务系统对提高酒店的工作效率和增加酒店的效益都是有好处 的,它影响了酒店经营业绩,也使酒店的竞争能力提升。它的优势主要在于有效展示酒店 形象和服务,建立与客户良好的互动关系,高效管理销售过程,而且显著降低销售成本 、提高经济效益和管理水平,提高营业收入,使得利润最大化,如此可见餐饮服务系统给 酒店带来了可观的收入。 本餐饮管理系统主要实现对餐饮系统相关信息的管理,其以日点单为心,其还 包括员工信息管理,员工所属部门信息的管理,房间台号以及房间类型的相关信息管理, 还包含了最基础的商品信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值