insert插入触发器的错误问题

课本259对insert操作的概念是:

当执行insert操作时,新的记录会被插入到触发表中,同时也添到inserted表中

首先创建如下触发器

create trigger stu_a
on student
after insert
as
begin
	declare @nm char(8)
	select @nm=inserted.stname from inserted
	if  exists(select stname from student where stname=@nm)
	begin
		print '不能插入'
		print @nm
		rollback transaction
	end
end

表中没有姓名为:‘山科大’为名的条目

我们作如下查询:

select *from student where stname='山科大'

if exists(select *from student where stname='山科大')
begin
print'你'
end

結果

我们查询上述结果发现输出都为空,那说明表中无山科大条目的数据

并且 exists确实返回了false,说明触发器的出错和exists无关。

于是:

我们对上述触发器做测试

insert into student(stno,stname,stsex,stbirthday)values('121021','山科大','男','1991-09-09')

不能插入
山科大
消息 3609,级别 16,状态 1,第 202 行
事务在触发器中结束。批处理已中止。

上面我们对@nm也进行了输出,说明获取到的insert的插入的姓名没有出错,那么我们做了如下修改

create trigger stu_a
on student
after insert
as
begin
	declare @nm char(8)
	select @nm=inserted.stname from inserted
	if  exists(select count(*) from student where stname=@nm having count(*)=2)
	begin
		print '不能插入'
		print @nm
		rollback transaction
	end
end

我们把if后面的语句换成:if exists(select count() from student where stname=@nm having count()=2)

然后我们对数据表做了查询:

121001 李贤友 男 1991-12-30 通信 52
121002 周映雪 女 1993-01-12 通信 49
121005 刘刚 男 1992-07-05 通信 50
121009 范永军 男 2000-07-06 NULL NULL
121010 你好 男 1991-09-09 NULL NULL
121011 你好 男 1991-09-09 NULL NULL
121013 范永军 男 1991-09-09 NULL NULL
121014 永军 男 1991-09-09 NULL NULL
121015 哈哈 男 1991-09-09 NULL NULL
121016 哈哈 男 1991-09-09 NULL NULL
121017 哈哈 男 1991-09-09 NULL NULL
121018 什麽 男 1991-09-09 NULL NULL
121019 什 男 1991-09-09 NULL NULL
121020 什麽 男 1991-09-09 NULL NULL
122000 范永军 男 2000-11-23 通信 50
122001 郭德强 男 1991-10-23 计算机 48
122002 谢萱 女 1992-09-11 计算机 52
122004 孙婷 女 1992-02-24 计算机 50
122006 范永军 男 2000-11-23 通信 50
122007 范永军 男 2000-11-23 通信 50
122008 范永军 男 2000-11-23 电气 50
122009 董智强 男 1992-11-23 计算机 50

发现名为‘李贤友’的仅有一条数据

于是我们创建上述触发器后运行如下sql:

insert into student(stno,stname,stsex,stbirthday)values('121021','李贤友','男','1991-09-09')

得到結果:

不能插入
李贤友
消息 3609,级别 16,状态 1,第 202 行
事务在触发器中结束。批处理已中止。

这是为什么?命名仅有一条数据,我们的判断条件是李贤友为两条时候才返回true,为啥这里返回了true。

故我们去看定义:

当执行insert操作时,新的记录会被插入到触发表中,同时也添到inserted表中

当我们执行insert语句进行触发器判断时已经把数据加入到表格了,也就是里面已经有两条数据了,故也就进入了if语句,为什么结束之后查看student的数据还是一条,因为rollback transaction我们撤回了上一次对数据库的操作。

也就是为什么课本的会出现插入一个没有的名字还会保错的原因,因为你新插入的名字也会当作结果返回出来。

为了进一步确定我们做了如下修改:

``select count() from student where stname=@nm having count()=3

把判断条件改为3,同时我们选取数据库名字只有一个的数据进行插入,比如:周映雪

insert into student(stno,stname,stsex,stbirthday)values(‘121022’,‘周映雪’,‘男’,‘1991-09-09’)

插入成功!

这是为啥?因为本来里面只有一个'周映雪'我们插入的时候里面会有两个‘周映雪’,但是不到3,所以exists返回了false。也就进一步验证了 我们insert触发器进行触发的时候正在插入的数据也会当作结果集进行判断。

你可能感兴趣的:(insert插入触发器的错误问题)