一、实验目的
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关键字。
智者乐水,仁者乐山,幸福之人关注“理工科日记”
获取原文文档请关注“理工科日记”,回复数据库获取。