【SQL】基礎實驗6——存儲過程和觸發器的使用

 

一、實驗目的

1、掌握存儲過程的創建、執行、修改和刪除操作

2、掌握觸發器的創建、修改和刪除操作

二、實驗內容、方法、步驟和實驗結果與分析【結果情況,碰到什麼問題,如何解決的?】

(一)存儲過程:

完成下列各題功能,保存或記錄實現各題功能的Transact-SQL語句。

1.在數據庫HrSystem 中創建存儲過程avg_wage,用於求所有員工的平均工資,並通過輸出參數返回該平均工資。要求在創建存儲過程之前首先判斷該存儲過程是否已經存在,如果存在,則將其刪除。

方法:

USE HrSystem

GO

/*判斷表sysobjects中是否存在列名爲“avg_wage”且類型爲“P”(存儲過程)的列*/

IF EXISTS(SELECT name FROM sysobjects WHERE name='avg_wage' AND type='P')

   DROP PROCEDUREavg_wage

GO

/*創建存儲過程*/

CREATE PROCEDURE avg_wage

@avgwage float=0 output

AS

SELECT @avgwage=AVG(wage) FROM Employees

GO

步驟及結果:

分析:創建存儲使用PROCEDURE關鍵字,存儲結構有帶參數和不帶參數之分。

 

2.執行第1題創建的存儲過程avg_wage,打印員工平均工資。

方法:

USE HrSystem

GO

DECLARE @avgwage float

EXEC avg_wage@avgwage output

print @avgwage

GO

步驟及結果:

分析:創建好存儲結構後,還需要執行語句,才能夠調用該存儲結構,並該指明輸入輸出變量。

 

3.在數據庫HrSystem中創建存儲過程max_wage,根據指定的部門名稱(輸出參數)返回該部門的最高工資(輸出參數)。要求在創建存儲過程之前要首先判斷該存儲過程是否已經存在,如果存在,則將其刪除。

方法:

USE HrSystem

GO

IF EXISTS(SELECT name FROM sysobjects WHERE name='max_wage' AND TYPE='P')

   DROP PROCEDUREmax_wage

GO

CREATE PROCEDURE max_wage

@maxwage float output,

@depname char(20) output

AS

SELECT @maxwage=max(e.Wage),@depname=d.Dep_name FROM Employees e,Departments d

WHERE (d.Dep_id=e.Dep_id)

GROUP BY D.Dep_name

GO

步驟及結果:

分析:創建存儲過程,語句必須是該語句批次中的第一句。

 

4.執行第3題創建的存儲過程max_wage,指定部門爲“財務部”,打印該類部門的最高工資。

方法:

USE HrSystem

GO

DECLARE @maxwage float,@depname char(20)

EXEC max_wage@maxwage output,@depname output

print @maxwage

print @depname

GO

步驟及結果:

分析:PRINT關鍵字用於提示信息或結果信息的顯示輸出。

 

5.刪除存儲過程avg_wage和max_wage。

方法:

USE HrSystem

GO

DROP PROCEDURE avg_wage,max_wage

GO

步驟及結果:

分析:刪除存儲結構與刪除數據庫、表、視圖等過程一樣,都是使用DROP關鍵字。

 

(二)觸發器:

創建一個“學生信息”數據庫,包含“學生基本信息”表、“專業”表和“系”表,各表包含的字段如下。

·“學生基本信息”表:學號;姓名;性別;班級;出生日期;專業編號。

·“系”表:系編號;系名稱;系簡介。

·“系”表:系編號;系名稱;系簡介。

各字段類型按其實際含義自行定義,輸入一些數據,要求數據要有代表性。

以下操作要求全部在SQL Server Management Studio中完成,保存或記錄實現各題功能的

步驟及結果:

 

Transcat-SQL語句(包括測試相應觸發器是否生效的相關語句及測試結果)。

1.在“專業”表上創建一個INSERT觸發器“TRG1",當發生插入專業表操作時,將顯示插人的記錄。

方法:

USE學生信息

GO

/*判斷表sysobjects中是否存在列名爲“TRG1”且類型爲“TR”(觸發器)的列*/

IF EXISTS(SELECT name FROM sysobjects WHERE name='TRG1' AND type='TR')

   DROP TRIGGERTRG1

GO

CREATE TRIGGER TRG1 ON 專業

FOR INSERT

AS

SELECT * FROMinserted

GO

/*插入數據,檢驗TRG1是否會被觸發*/

USE學生信息

GO

INSERT INTO 專業 VALUES(6,'電子信息工程',6)

GO

步驟及結果:

分析:創建觸發器同創建存儲過程一樣,必須是該語句批次中的第一句。

 

2.在“專業”表上創建一個DELETE觸發器“TRG2",當發生刪除操作時,將給出警告、列出刪除的記錄並撒銷刪除。

方法:

USE學生信息

GO

/*判斷表sysobjects中是否存在列名爲“TRG1”且類型爲“TR”(觸發器)的列*/

IF EXISTS(SELECT name FROM sysobjects WHERE name='TRG2' AND type='TR')

   DROP TRIGGERTRG2

GO

CREATE TRIGGER TRG2 ON 專業

FOR DELETE

AS

PRINT('專業表中的數據不允許刪除')

SELECT * FROMdeleted

ROLLBACK TRANSACTION

GO

/*刪除信息,檢驗觸發器是否創建成功*/

DELETE FROM 專業 WHERE專業編號=1

GO

步驟及結果:

分析:創建好觸發器後,需要相應的測試語句檢測。

 

3.在“專業”表上創建一個UPDTAE觸發器“TRG3",當發生更新“專業名稱”字段的操作時,給出警告並撤銷更新。

方法:

USE學生信息

GO

IF EXISTS(SELECT name FROM sysobjects WHERE name='TRG3' AND type='TR')

   DROP TRIGGERTRG3

GO

CREATE TRIGGER TRG3 ON 專業

FOR update

AS

IF UPDATE (專業名稱)

BEGIN

   PRINT('專業表中專業名稱不允許更改')

   ROLLBACK TRANSACTION

END

GO

/*測試語句*/

UPDATE專業 SET專業名稱='專業名稱'WHERE專業編號=1

GO

步驟及結果:

分析:創建觸發器,IF UPDATE語句用於判斷指定值是否發生變化。

 

4、在“學生基本信息”表上創建個更新觸發器"TRG4",當發生更新“學號”或“姓名”字段的操作時給出警告,並撤銷更新。

方法:

USE學生信息

GO

IF EXISTS(SELECT name FROM sysobjects WHERE name='TRG4' AND type='TR')

   DROP TRIGGERTRG4

GO

CREATE TRIGGER TRG4 ON 學生基本信息

FOR UPDATE

AS

IF UPDATE(學號) ORUPDATE(姓名)

BEGIN

   PRINT('學號和姓名不允許修改')

   ROLLBACK TRANSACTION

END

GO

/*測試語句*/

UPDATE學生基本信息 SET學號='12345678901' WHERE 學號='2002090164'

UPDATE學生基本信息 SET姓名='小明' WHERE姓名='李小華'

GO

步驟及結果:

分析:創建觸發器,ROLLBACK TRANSACTION語句用於回滾不允許發生的事務。

 

5. 刪除以上各題創建的所有觸發器。

(做好“學生信息”數據庫的備份,以備第10章、第11章上機操作時使用。)

方法:

USE學生信息

GO

DROP TRIGGER TRG1

DROP TRIGGER TRG2

DROP TRIGGER TRG3

DROP TRIGGER TRG4

GO

步驟及結果:

 

三、實驗小結【對自己而言,通過實驗學到的關鍵技術方法】

 1、存儲過程由參數、編程語句和返回值組成;分爲:帶參數和不帶參數的兩種;

2、使用存儲過程有:允許模塊化程序設計、允許更快執行、減少網絡流量和可作爲安全機制使用等優勢;

3、可以子啊存儲過程中使用RETURN語句返回一個狀態值,但返回值只能是整數;

4、觸發器是一種特殊類型的存儲過程,它再指定的表發生變化時被觸動,從而自動生效;

5、ROLLBACKTRANSACTION語句用於回滾事務;

6、刪除存儲過程以及觸發器均用DROP關鍵字。

 

智者樂水,仁者樂山,幸福之人關注理工科日記

獲取原文文檔請關注“理工科日記”,回覆數據庫獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章