中国开发网: 论坛: 程序员情感CBD: 贴子 574771
haitao
完整的3个实验
3 楼zjcxc(邹建)回复于 2004-09-23 14:01:55 得分 0 --下面演示了SQL错误处理的脆弱性
--邹建

--演示1
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'

select * from newid()
if @@error<>0
print '发生错误2'
go

--调用
exec p1
go

--删除测试
drop proc p1

/*--测试结果

服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。

--*/


/*--结论1:

错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果

--*/

Top

4 楼zjcxc(邹建)回复于 2004-09-23 14:02:03 得分 0
--演示2,存储过程嵌套调用中的错误

--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'

select * from newid()
if @@error<>0
print '发生错误2'
go

--测试的存储过程2
create proc p2
as
exec p1

if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go

--调用
exec p2
go

--删除测试
drop proc p1,p2

/*--测试结果

服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/


/*--结论2:

被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/

Top

5 楼zjcxc(邹建)回复于 2004-09-23 14:02:11 得分 0
--演示3,更严重的错误,无法用 set xact_abort on 来自动回滚事务
set xact_abort on --我们希望能自动回滚事务
begin tran
create table #t(id int)
insert #t select 1
select * from newid()
commit tran
go

select * from #t
rollback tran
/*--测试结果


(所影响的行数为 1 行)

服务器: 消息 208,级别 16,状态 1,行 5
对象名 'newid' 无效。

id
-----------
1

(所影响的行数为 1 行)
--*/

/*--结论3:

我们希望 set xact_abort on 可以实现出错时自动回滚事务
但结果令我们希望,出错时,事务并没有被回滚
因为我们查询到了#t的结果,而且最后的回滚语句也并没有报错
--*/
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录