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