數據庫 實驗五 觸發器、存儲過程操作實驗


完全轉發自: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)建立觸發器

方法一:使用企業管理器

首先,打開企業管理器,定位數據庫並找到要創建觸發器的表;

然后,右擊該表名,在彈出的快捷菜單中選擇“設計表”,在打開的“設計表”窗口中單擊clip_image002按鈕。

最后,在觸發器屬性窗口中輸入觸發器的內容,並單擊“確定”按鈕。

方法二:使用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、在建立查詢指定讀者號的閱讀信息的存儲過程時出現如下錯誤

clip_image004 ,將每一行的語句都頂格寫,命令成功生成。

六、實驗結果

1、基本操作實驗

(1)在讀者表上建立一個DELETE類型的觸發器lianxi_del:

clip_image006

(2)建立一個查詢指定讀者號的閱讀信息的存儲過程List_jy

clip_image008

2、提高操作實驗

(1)在STUDENT表中插入一行數據

INSERT

INTO STUDENT

VALUES('20012123','成龍','男','20','MA')

查看STU表,插入一行數據:

clip_image010

(2)在STUDENT表刪除一行數據:

DELETE

FROM STUDENT

WHERE SNO='20015129'

查看STU表,又插入一行數據:

clip_image012

(3)從學生-課程數據庫中,查找學號為200215122的學生信息

在查詢分析器中輸入:

EXECUTE P_CX'200215122'

輸出結果:

clip_image014

(4)從學生-課程數據庫中,通過統計存儲過程查找學號為200215122的學生的統計信息

在查詢分析器中輸入:

EXECUTE P_CIJJ'200215122'

輸出結果:

clip_image016

(5)在查詢分析器中輸入:

declare @sum int

execute p_sum 5, @sum output

print '總分為:'+str(@sum)

輸出結果:

clip_image018

(6)在查詢分析器中輸入:

declare @c int

exec p_rand 100,300,@c output

print '一個隨機數' +str(@c)

clip_image020

七、總結

這次實驗主要是讓我們了解如何創建一個觸發器,觸發器在數據庫中是如何作用的,如何創建存儲過程,存儲過程有什么用。

通過認真完成每一道題目,知道了對一個表建立一個或多個觸發器后,對表進行作用時,會激活相應的觸發器,實現相應的觸發作用;知道了通過建立存儲過程,可以簡化查找等操作功能,避免重復工作。

這是數據庫實驗的最后一次實驗,對這五次實驗,我都是認真的對待,花費的時間不少,但是我收獲很大。讓我重新了解了一遍數據庫知識,既完成了實驗,又起到了復習的作用,一舉兩得。通過實驗,我對數據庫的使用更加了解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM