南昌大学实验报告
学生姓名: 王 国 强 学 号: 6103113049 专业班级: 计科132 实验类型:■ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩: 实验项目名称: 触发器
实验目的和要求:
(1) 理解触发器的触发过程和类型。
(2) 掌握创建触发器的方法。
(3) 掌握查看触发器的方法。
(4) 掌握修改触发器的方法。
掌握删除触发器的方法。
实验内容、实验过程、所遇问题及其解决方法
实验内容:
针对实验数据库SHIYAN,完成以下相关触发器操作任务:
(1) 利用Transact-SQL语言为S表建立一个名为s_insert的insert触
发器,通过s_insert触发器以保证向S表中插入记录时status字段值要以1、2、3、4或5字符打头。
如果插入的记录的status字段值不是以1、2、3、4或5字符打头的,则拒绝插入该记录,并且输出提示信息“status字段值不是以1、2、3、4或5字符打头的!”
实现语句:
create trigger s_insert
on s
for insert
as if(select count(*) from inserted
where status like '[1,2,3,4,5]%')=0
begin
print 'status字段不是以1,2,3,4,5字符打头的!'
rollback transaction
end
(2) 利用“企业管理器”为P表建立一个名为P_weight的update
触发器,通过P_weight触发器以保证修改P表中数据时,限制weight字段的值在1000以内。如果修改后的记录的weight字段值超过了1000,则拒绝修改记录,并却输出提示信息“当前被修改的记录的weight字段值不在1000之内,请重新给定该字段值。”,否则可以修改记录,并且输出提示信息“当前被修改的记录的weight字段值满足要求,完成修改操作。”。
实现语句:
create trigger p_weight
on p
for update
as if(select count(*) from inserted
where weight>1000)>0
begin
print '当前修改的weight字段不在1000以内,请重新输入字段值'
rollback transaction
end
else
print '当前修改记录的weight值满足要求,成功完成修改操作'
更新结果:
(3) 利用Transact-SQL语言为J表建立一个名为j_delete的delete触
发器,通过j_delete触发器保证在删除工程项目表J中记录时,该待删除记录的SPJ表中存在引用关系,并且对应的引用关系记录的供应数量QTY值不少于50,
则不能删除该工程项目记录,
输出提示信息“不满足删除要求。”;否则可以删除,输出提示信息“相应的工程项目信息已经成功删除。”。
实现语句:
create trigger j_delete
on j
for delete
as if(
select count(*)
from inserted,spj
where inserted.jno=spj.jno and spj.qty>50)>0
begin
print '不满足删除条件'
rollback transaction
end
else
print '相应的工程项目已经删除'
运行结果:
(4) 利用Transact-SQL语言修改触发器s_insert,修改后的s_insert
触发器能保证在修改S表中数据记录时s_insert字段值不可以修改。
实现语句:
alter trigger s_insert
on s
for update
as if(select count(*) from inserted,s
where inserted.status=s.status)>0
begin
print 'status字段不是以1,2,3,4,5字符打头的!'
rollback transaction
end
(5) 将触发器s_insert的名称更改为s_insert_update。
执行语句:
exec sp_rename 's_insert','s_status_update'
(6) *查看数据表P中所有的inserted触发器,并观察其执行结果。 执行语句:
exec sp_helptrigger p,inserted;
结果:
(7) *查看触发器就j_delete的定义文本。
执行语句:
exec sp_helptext 'j_delete'
结果:
(8) *查看触发器p_weight的所有者和创建日期。
exec sp_help 'p_weight'
结果:
(9) *分别利用“企业产管理器”和SQL语言删除触发器
s_status_update。
SQL删除
drop trigger s_status_update
实验总结及心得体会:
这次的实验相比以前的要难一点,但只要多查课本还是可以找到实验中的部分答案的。