一、實驗目的
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關鍵字。
智者樂水,仁者樂山,幸福之人關注“理工科日記”
獲取原文文檔請關注“理工科日記”,回覆數據庫獲取。