完全轉發自:http://blog.sina.com.cn/s/blog_6ea6cd6a0100mp1n.html
一、實驗目的和要求
(1)掌握 SQL Server中的觸發器的使用方法;
(2)掌握存儲過程的操作方法。
二、實驗內容和原理
1. 基本操作實驗
在讀者-圖書數據庫中用Transact-SQL語句描述下列功能:
(1)在讀者表上建立一個DELETE類型的觸發器lianxi_del,觸發動作是顯示信息(已刪除讀者表中的數據),執行下列語句:
create trigger lianxi_del
on 讀者
for delete
as print ‘已刪除讀者表中的數據’
(2)建立一個查詢指定讀者號的閱讀信息的存儲過程List_jy,輸入參數為讀者號,如果沒有輸入讀者號,則要輸出提示信息。建立這個存儲過程的語句如下所示。
create procedure List_jy
@p_dzh char(5) = null
as
if @p_dzh is null
begin
print ‘請輸入一個讀者號’
return
end
else
select 編號,姓名,書名,借閱時間
from 讀者,借閱,圖書
where 讀者.編號=借閱.讀者編號 and 借閱.書號=圖書.書號
and 讀者.編號=@p_dzh
2. 提高操作實驗
在學生-課程數據庫中用Transact-SQL語句描述下列功能:
(1)為學生表建立一個名TRI_INSERT的INSERT觸發器。功能是當用戶向學生表添加數據時,同時也把這些數據添加到stu表中。其中:學生表和表stu的結構相同。
(2)為學生表建立一個名TRI_DELETE的DELETE觸發器。功能是當用戶從學生表刪除數據時,同時把這些要刪除的數據添加到stu表中。其中:表student和表stu的結構相同。
(3)創建一查詢存儲過程,過程名稱為P_CX。參數是學號,輸出信息是指定學號所應的姓名、課程名稱、成績。運行時若沒有指定學號,則提示請輸入學號;若學號不存在則提示學號不存在。
(4)創建一統計存儲過程,過程名稱為P_CJTJ。參數是學號,輸出信息是指定學號的姓名、選課門數、平均分、總分、最高分、最低分。運行時若沒有指定學號,則提示輸入學號;若學號不存在則提示學號不存在。
(5)創建一個實現求1—n所有數之和的存儲過程, 過程名稱為P_SUM。參數是n,輸出是前n個之和。如:n=100,則輸出5050。
三、實驗環境
硬件:計算機
軟件:Windows 2000和SQL Server 2000
四、算法描述及實驗步驟
1. 觸發器的操作
(1)建立觸發器
方法一:使用企業管理器
首先,打開企業管理器,定位數據庫並找到要創建觸發器的表;
然后,右擊該表名,在彈出的快捷菜單中選擇“設計表”,在打開的“設計表”窗口中單擊按鈕。
最后,在觸發器屬性窗口中輸入觸發器的內容,並單擊“確定”按鈕。
方法二:使用CREATE TRIGGER語句
語法:
CREATE TRIGGER <觸發器名>
ON { <表名> | <視圖名>}
{ FOR | INSTEAD OF | AFTER}
{ [UPDATE] [,] [INSERT] [,] [DELETE]}
AS
<SQL 語句塊>
(2)查看觸發器
使用企業管理器
2. 提高操作實驗
在學生-課程數據庫中用Transact-SQL語句描述下列功能:
1)為學生表建立一個名TRI_INSERT的INSERT觸發器。功能是當用戶向學生表添加數據時,同時也把這些數據添加到stu表中。其中:學生表和表stu的結構相同。
CREATE TRIGGER TRI_INSERT
ON STUDENT
FOR INSERT
AS
INSERT INTO STU
SELECT * FROM INSERTED
(2)為學生表建立一個名TRI_DELETE的DELETE觸發器。功能是當用戶從學生表刪除數據時,同時把這些要刪除的數據添加到stu表中。其中:表student和表stu的結構相同。
CREATE TRIGGER TRI_DELETE
ON STUDENT
FOR DELETE
AS
INSERT INTO STU
SELECT * FROM DELETED
(3)創建一查詢存儲過程,過程名稱為P_CX。參數是學號,輸出信息是指定學號所應的姓名、課程名稱、成績。運行時若沒有指定學號,則提示請輸入學號;若學號不存在則提示學號不存在。
create procedure P_CX
@sno char(10) =null
as
if @sno is null
begin
print '請輸入一個學號'
return
end
else if(not exists
(select * from student where sno=@sno))
print '學號不存在'
else
select sname,course.cno,grade
from student,course,sc
where student.sno=sc.sno and course.cno=sc.cno and student.sno=@sno
(4)創建一統計存儲過程,過程名稱為P_CJTJ。參數是學號,輸出信息是指定學號的姓名、選課門數、平均分、總分、最高分、最低分。運行時若沒有指定學號,則提示輸入學號;若學號不存在則提示學號不存在。
create procedure P_CIJJ
@sno char(10) =null
as
if @sno is null
begin
print '請輸入一個學號'
return
end
else if(not exists
(select * from student where sno=@sno))
print '學號不存在'
else
select sname,count(cno) 門數,avg(grade) 平均分,sum(grade) 總分,max(grade) 最高分,min(grade) 最低分
from sc,student
where student.sno=@sno
group by sname
(5)創建一個實現求1—n所有數之和的存儲過程, 過程名稱為P_SUM。參數是n,輸出是前n個之和。如:n=100,則輸出5050。
create procedure P_SUM
@n int,
@sum int output
as
declare @i int
set @sum=0
set @i=0
while(@i<=@n)
begin
set @sum=@sum+@i
set @i=@i+1
end
(6)創建一個求指定區間[a,b]的隨機數的存儲過程, 過程名稱為P_RAND。參數據是a和b(a<b),輸出a到b之間的一個隨機數。
create procedure p_rand
@a int,
@b int,
@c int output
as
set @c =cast((rand()*(@b-@a))+@a as int)
print '一個隨機數' +str(@c)
五、調試過程
1、在建立查詢指定讀者號的閱讀信息的存儲過程時出現如下錯誤
六、實驗結果
1、基本操作實驗
(1)在讀者表上建立一個DELETE類型的觸發器lianxi_del:
(2)建立一個查詢指定讀者號的閱讀信息的存儲過程List_jy
2、提高操作實驗
(1)在STUDENT表中插入一行數據
INSERT
INTO STUDENT
VALUES('20012123','成龍','男','20','MA')
查看STU表,插入一行數據:
(2)在STUDENT表刪除一行數據:
DELETE
FROM STUDENT
WHERE SNO='20015129'
查看STU表,又插入一行數據:
(3)從學生-課程數據庫中,查找學號為200215122的學生信息
在查詢分析器中輸入:
EXECUTE P_CX'200215122'
輸出結果:
(4)從學生-課程數據庫中,通過統計存儲過程查找學號為200215122的學生的統計信息
在查詢分析器中輸入:
EXECUTE P_CIJJ'200215122'
輸出結果:
(5)在查詢分析器中輸入:
declare @sum int
execute p_sum 5, @sum output
print '總分為:'+str(@sum)
輸出結果:
(6)在查詢分析器中輸入:
declare @c int
exec p_rand 100,300,@c output
print '一個隨機數' +str(@c)
七、總結
這次實驗主要是讓我們了解如何創建一個觸發器,觸發器在數據庫中是如何作用的,如何創建存儲過程,存儲過程有什么用。
通過認真完成每一道題目,知道了對一個表建立一個或多個觸發器后,對表進行作用時,會激活相應的觸發器,實現相應的觸發作用;知道了通過建立存儲過程,可以簡化查找等操作功能,避免重復工作。
這是數據庫實驗的最后一次實驗,對這五次實驗,我都是認真的對待,花費的時間不少,但是我收獲很大。讓我重新了解了一遍數據庫知識,既完成了實驗,又起到了復習的作用,一舉兩得。通過實驗,我對數據庫的使用更加了解