课本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触发器进行触发的时候正在插入的数据也会当作结果集进行判断。