課本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觸發器進行觸發的時候正在插入的資料也會當作結果集進行判斷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/279653.html
標籤:其他
上一篇:關系資料庫理論(一)
