一、实验目的
进一步熟悉SQL语句对数据库进行完整性控制的方法;理解触发器的概念、定义方法和触发条件。理解游标的定义、打开、使用、关闭与释放的方法。
二、实验内容
1)设置一个触发器,该触发器仅允许“dbo”用户可以删除学生表内数据。
2)针对学生表写一个DELETE触发器。
3)针对学生表写一个UPDATE触发器。
4)统计学生的平均成绩,输出低于平均分的成绩(使用游标)。
三、实验方法与实验步骤
(1)实验方法:
1.熟悉DBMS 工作环境;
2.复习有关SQL语句对数据库进行完整性控制的方法;复习触发器的概念、定义方法和触发条件。复习游标的定义、打开、使用、关闭与释放的方法约束与存储过程的SQL语言命令。
(2)实验步骤:
1)设置一个触发器,该触发器仅允许“dbo”用户可以删除学生表内数据,否则出错。
2)针对学生表写一个DELETE触发器,删除数据,测试触发。
3)针对学生表写一个UPDATE触发器,更新数据,测试触发。
4)定义游标,统计学生的平均成绩,输出低于平均分的成绩。
四、实验结果
1)设置一个触发器,该触发器仅允许“dbo”用户可以删除学生表内数据,否则出错。
CREATE TRIGGER dboDelete
ON S
FOR DELETE
AS
BEGIN
IF user='dbo'
commit
ELSE
BEGIN
PRINT '不是dbo用户,不能删除!'
ROLLBACK
END
END
DELETE FROM S WHERE Sname='金宸';
2)针对学生表写一个DELETE触发器,删除数据,测试触发。
CREATE TRIGGER s_delete
ON S
FOR DELETE
AS
BEGIN
PRINT '测试触发'
END
DELETE FROM S WHERE Sname='金宸';
3)针对学生表写一个UPDATE触发器,更新数据,测试触发。
CREATE TRIGGER s_update
ON S
FOR UPDATE
AS
BEGIN
PRINT '测试触发'
END
DELETE FROM S WHERE Sname='金宸';
4)定义游标,统计学生的平均成绩,输出低于平均分的成绩。
/*定义游标,统计学生的平均成绩,输出低于平均分的成绩。*/
--1.声明游标中使用到的变量
Declare @low_score varchar(32)
--2.声明游标
Declare s_score_cursor CURSOR FOR
select avg(SC.grade) from SC group by SC.Sno having avg(SC.grade)<(select avg(SC.grade) from SC);
--3.打开游标
Open s_score_cursor
--4.推进游标
FETCH NEXT FROM s_score_cursor INTO @low_score
--5.逐行操作
WHILE @@FETCH_STATUS=0
BEGIN
PRINT '输出低于平均分的成绩:'+@low_score
FETCH NEXT FROM s_score_cursor INTO @low_score
END
--6.关闭游标
CLOSE s_score_cursor
--7.释放游标
Deallocate s_score_cursor
五、实验小结
本次实验主要学会了如何利用触发器对数据库中的数据进行进一步完整性约束,对触发器的理解更加深刻。同时学会了利用游标操作进行对查询等结果逐行操作,使用游标六步走、变量类型等细节处理。
遇到的问题主要是在使用游标时不够熟练,在输出低于平均分的成绩时,类型转换不成功;