《數(shù)據(jù)庫(kù)實(shí)驗(yàn)3 觸發(fā)器報(bào)告》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)庫(kù)實(shí)驗(yàn)3 觸發(fā)器報(bào)告(8頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 數(shù)據(jù)庫(kù)技專題訓(xùn)練I(2014年春)
序號(hào):
數(shù)據(jù)庫(kù)專題訓(xùn)練------觸發(fā)器
實(shí)驗(yàn)報(bào)告
系別:計(jì)算機(jī)科學(xué)與技術(shù)
班級(jí):計(jì)11-3班
姓名:黃娟娟
學(xué)號(hào):11101020324
成績(jī):
評(píng)語(yǔ):
指導(dǎo)教師簽字: 日期:
實(shí)驗(yàn)二 觸發(fā)器
一、 實(shí)驗(yàn)環(huán)境及要求
觸發(fā)器是一種特殊的存儲(chǔ)過程,不能被用戶直接調(diào)用。可以包含復(fù)雜的 SQL語(yǔ)句。在特定事件發(fā)生時(shí)自動(dòng)觸發(fā)執(zhí)行,通常用于實(shí)現(xiàn)強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。DML
2、觸發(fā)器分為兩種類型:AFTER 觸發(fā)器和 INSTEAD OF觸發(fā)器。
通過本次實(shí)驗(yàn)掌握觸發(fā)器的創(chuàng)建方法以及使用方法。
二、 實(shí)驗(yàn)步驟及結(jié)果
1) 創(chuàng)建一個(gè)名為tri_Insert_S的觸發(fā)器,測(cè)試改觸發(fā)器的執(zhí)行情況,并給出實(shí)驗(yàn)結(jié)果。當(dāng)插入的新記錄中Sage的值不是18至25之間的數(shù)值時(shí),就激活該觸發(fā)器,撤銷該插入操作,并給出錯(cuò)誤提示。
use SXCJ
go
create trigger tri_Insert_S on S
after insert
as
if exists (select * from inserted
where S
3、age>=18 and Sage<=25)
print'添加成功!'
else
begin
print'無(wú)法添加!'
rollback transaction
end
go
insert into S values('S8','黃麗','女',26,'計(jì)算機(jī)')
insert into S values('S8','黃麗','女',20,'計(jì)算機(jī)')
select *
from S
go
顯示如下:
insert into S values('S8','黃麗','女',26,'計(jì)算機(jī)')
insert
4、 into S values('S8','黃麗','女',20,'計(jì)算機(jī)')
2) 創(chuàng)建一個(gè)名為tri_Update_SC的觸發(fā)器,要求:(1)首先判斷數(shù)據(jù)庫(kù)中是否已經(jīng)存在名為tri_Update_SC的觸發(fā)器,如果存在,首先刪除,再創(chuàng)建。(2)當(dāng)試圖修改SC表中的學(xué)生成績(jī)時(shí),給出不能隨便修改成績(jī)的信息提示。
use SXCJ
go
if exists(select name from sysobjects
where name='tri_Update_SC' and type='TR')
begin
drop trigger tr
5、i_Update_SC
end
else
print'不存在該觸發(fā)器,可新建。'
Go
顯示如下:
create trigger tri_Update_SC on SC
after update
as
if update(Score)
begin
print'不能隨意修改成績(jī)!'
rollback transaction
end
go
update SC
set score=90
Go
顯示如下:
3)使用系統(tǒng)存儲(chǔ)過程sp_help,sp_helptext,sp_helptrigger查看觸發(fā)器相關(guān)
6、信息。給出顯示結(jié)果。
use SXCJ
go
exec sp_help 'tri_Insert_S'
exec sp_helptext 'tri_Insert_S'
exec sp_helptrigger 'S'
go
顯示如下:
4) 禁用tri_Update_SC觸發(fā)器,并演示禁用該觸發(fā)器后Update的執(zhí)行情況。
use SXCJ
go
alter table SC disable trigger tri_Update_SC
update SC
set Score='95'
where Sno='S1' and Cno='C3'
7、print'修改成功!'
select *
from SC
Go
顯示如下:
5)在SC表上創(chuàng)建一個(gè)instead of類型的觸發(fā)器,觸發(fā)器名稱為:tri__Insert_SC。實(shí)現(xiàn):當(dāng)向表SC插入記錄時(shí)檢查分?jǐn)?shù)的合理性,分?jǐn)?shù)必須在0到100之間,如果不合理就拒絕插入,并給出信息提示,
use SXCJ
go
if exists(select name from sysobjects
where name='tri__InseCrt_SC' and type='TR')
begin
drop trigg
8、er tri__InseCrt_SC
end
else
begin
create trigger tri__InseCrt_SC on SC
instead of insert
as
if exists(select * from inserted
where Score>=0 and Score<=100)
begin
insert into SC
select * from inserted
print'插入成功!'
end
else
9、 begin
rollback transaction
print'分?jǐn)?shù)必須在到之間,插入數(shù)據(jù)失敗!'
end
end
go
insert into SC
values('S3','C3',110)
go
顯示如下:
6) 創(chuàng)建一個(gè)名為tir_Update_S的觸發(fā)器,實(shí)現(xiàn):當(dāng)學(xué)生基本表S中的學(xué)號(hào)Sno發(fā)生變化時(shí),SC選課記錄中對(duì)應(yīng)的學(xué)號(hào)也發(fā)生改變。并通過測(cè)試數(shù)據(jù)驗(yàn)證該觸發(fā)器的執(zhí)行情況。
use SXCJ
go
if exists(select name from sysobjects
10、 where name='tir_Update_S' and type='TR')
begin
drop trigger tir_Update_S
end
go
create trigger tir_Update_S on S
after update
as
declare @OldSno varchar(20),@newSno varchar(20)
select @OldSno=Sno from deleted
select @newSno=Sno from inserted
if (update(Sno))
begin
11、 update SC
set SC.Sno=@newSno
where SC.Sno=@OldSno
end
else
rollback transaction
go
update S
set Sno='S11'
where Sno='S1'
select * from S
select * from SC
顯示如下:
S表:
SC表:
7) 創(chuàng)建一個(gè)名為tri_Delete_C 的觸發(fā)器,實(shí)現(xiàn):刪除一門課程時(shí)候,首先判斷該課程有否有人選,如果有人選,則
12、不能刪除并通過測(cè)試數(shù)據(jù)驗(yàn)證該觸發(fā)器的執(zhí)行情況。
use SXCJ
go
create trigger tri_Delete_C on C
instead of delete
as
if(exists (select * from SC,deleted
where SC.Cno=deleted.Cno))
begin
rollback transaction
print'該課程無(wú)法刪除!'
end
else
begin
delete from C where Cno in( select Cno from dele
13、ted)
end
go
delete from C
where Cno='C1'
go
顯示如下:
三、 實(shí)驗(yàn)中的問題及解決方法
問題:對(duì)update觸發(fā)器不是很熟悉,在建立此觸發(fā)器的時(shí)候,對(duì)于deleted表和inserted表調(diào)用的不當(dāng),導(dǎo)致老出現(xiàn)問題。
解決方法:通過查詢資料,了解到deleted表是存放更新前的數(shù)據(jù),而inserted表是存放更新后的數(shù)據(jù)。通過定義變量,先把表內(nèi)的數(shù)據(jù)賦值到變量上,然后能夠靈活應(yīng)用。
四、 實(shí)驗(yàn)總結(jié)
通過實(shí)驗(yàn)大概學(xué)習(xí)了AFTER 觸發(fā)器和INSTEAD OF觸發(fā)器。實(shí)踐了觸發(fā)器的創(chuàng)建方法以及使用
14、方法。
其中,AFTER 觸發(fā)器又稱為后觸發(fā)器,該類觸發(fā)器是在引起觸發(fā)器執(zhí)行的修改語(yǔ)句成功完成之后執(zhí)行。如果修改語(yǔ)句因錯(cuò)誤(如違反約束或語(yǔ)法錯(cuò)誤)而失敗,觸發(fā)器將不會(huì)執(zhí)行。此觸發(fā)器只能定義在表上,不能創(chuàng)建在視圖上。可以為每個(gè)觸發(fā)操作(INSERT、UPDATE或DELETE)創(chuàng)建多個(gè)AFTER觸發(fā)器。
INSTEAD OF觸發(fā)器(又稱為替代觸發(fā)器)當(dāng)引起觸發(fā)器執(zhí)行的修改語(yǔ)句停止執(zhí)行時(shí),該類觸發(fā)器代替觸發(fā)操作執(zhí)行。該類觸發(fā)器既可在表上定義,也可在視圖上定義。對(duì)于每個(gè)觸發(fā)操作(INSERT、UPDATE和DELETE)只能定義一個(gè)INSTEAD OF觸發(fā)器。
由于對(duì)INSTEAD OF觸發(fā)器掌握不是很牢固,在建立過程中出現(xiàn)問題。而且對(duì)于update觸發(fā)操作使用的不是很好。在實(shí)驗(yàn)過程,通過老師上課的ppt以及在網(wǎng)上查詢資料都能夠順利的解決在實(shí)驗(yàn)中發(fā)生的問題。