数据库原理实验10
更新时间:2023-10-19 22:50:01 阅读量: 综合文库 文档下载
实验十 触发器
1 实验目的与要求
(1) 掌握触发器的创建和使用方法。 (2) 掌握游标和触发器的综合应用方法。
2 实验内容
请完成下面实验内容:
(1) 创建触发器,该触发器仅允许“dbo”用户可以删除Employee表内数据。 脚本:
create trigger employeedelete on employee48 for delete as
if exists (select * from deleted) begin
if user!='dbo' begin
print'出错了!' rollback end
end
结果:
测试如下:
(2) 创建触发器,当向订单明细表添加销售明细数据时,统计该订单销售金额。要求:如果订单金额5000元及以上,则该订单中销售的所有商品按9折进行优惠处理(更新订单明细表中成交价格),同时还应更新订单总表中该订单的订单金额。 脚本:
(1) 触发器脚本:
alter trigger OrDetailinsert on OrderDetail48 for insert as
1
declare @ordersum numeric(8,2)
declare @orderNo char(12),@productNo char(12), @tot
numeric(8,2),@jilu char(12)
declare cur_ordetail cursor for--建立插入表游标 select orderNo48,productNo48,quantity48*price48 as total from open cur_ordetail begin transaction
create table linshi --创建临时表 (
orderNo char(12) not null, total numeric(8,2) null
constraint linshipk primary key(orderNo) )
set @ordersum=0.00
fetch cur_ordetail into @orderNo,@productNo,@tot while(@@fetch_status=0) begin
if @orderNo in (select orderNo from linshi)--如果订单编号相同,
select @ordersum=sum2 --计算插入明细各个订单的总金额 from (
select orderNo48,sum(quantity48*price48) sum2 from orderDetail48 group by orderNo48 ) b
Inserted
where b.orderNo48=@orderNo
就直接更新总金额 begin
end
close cur_ordetail
else --否则就往临时表新插入数据 insert linshi values(@orderNo,@ordersum)
fetch cur_ordetail into @orderNo,@productNo,@tot
update linshi set total=@ordersum where orderno=@orderNo
end
2
deallocate cur_ordetail
declare cur_linshi cursor for --建立对临时表的游标,判断订单总金额是否>5000 select *from linshi open cur_linshi
fetch cur_linshi into @orderNo,@tot while(@@fetch_status=0) begin
if @tot>5000 --如果大于5000,怎将其所对应订单单价全部打九折 begin
update orderDetail48 set price48=0.9*price48
where orderdetail48.orderno48=@orderNo
end
fetch cur_linshi into @orderNo,@tot
end
close cur_linshi deallocate cur_linshi
update orderMaster48 --更新订单总表 set orderSum48=sum2 from (
select orderNo48,sum(quantity48*price48) sum2 from orderDetail48 group by orderNo48) b
where orderMaster48.orderNo48=b.orderNo48 drop table linshi --删除临时表 commit tran 原图:
--提交事务
明细表
插入语句:
主表
Insert orderDetail48 values('200801090002','P20060003','5','1080.00')
3
其订单金额大于5000,可以看到20080109002这个订单所有的price均打了九折
结果:
变化后明细表
变化后主表
(3) 创建触发器,要求当修改Employee表中员工的出生日期或雇佣日期时,必须保证出生日期在雇佣日期之前,且雇佣日期与出生日期之间必须间隔16周年及以上。
脚本:
create trigger employupt on employee48 for update as
if update(birthday48) or update(hiredate48) begin
declare @birthday datetime,@hiredate datetime
select @birthday=birthday48,@hiredate=hiredate48 from deleted if year(@hiredate)-year(@birthday)<16 rollback else begin
select @birthday=birthday48,@hiredate=hiredate48 from inserted
update employee48
set birthday48=@birthday,hiredate48=@hiredate from employee48 a,inserted b
where a.employeeno48=b.employeeno48
end
End
测试:
4
update employee48 set hiredate48=1993-3-28 from employee48
where employeeno48='E2005001'
结果:
测试二:
update employee48
set hiredate48='1984-3-28' from employee48
where employeeno48='E2005002' 结果:
(4) 当更新Customer表中的customerNo列的值的时候(一次只能更新一行),同时更新
OrderMaster表中的customerNo列的值。 脚本:
alter trigger cusupt on customer48 for update as
if update(customerno48) begin
declare @customerno1 char(9),@customerno2 char(9),@row int declare cus_cur cursor for
select a.customerno48,b.customerno48 from deleted a,inserted b
select @row=count(*)from deleted if @row>1
rollback begin else
open cus_cur
fetch cus_cur into @customerno1,@customerno2 while(@@fetch_status=0) begin
update customer48
update ordermaster48
set customerno48=@customerno2
set customerno48=@customerno2
where customerno48=@customerno1
5
正在阅读:
数据库原理实验1010-19
大学园林景观环境设计历年考研真题-南京林业大学2006年攻读硕士学位研究生入学考试05-06
LTE NAS-EMM过程05-11
我用我的眼睛看环境作文400字07-06
教科版小学三年级科学上册复习资料09-19
阿尔都塞:意识形态与形态国家机器(研究笔记)陈越修改稿05-29
建国60周年中国交通发展史论文03-19
典型的晶体结构06-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 原理
- 实验
- 数据库
- 土力学习题及答案--第四章
- 国际法 - 本科 - 期末复习 - 重点
- 全员范围内践行QC小组活动
- 广东省中山纪念中学 - 学年高一数学下学期期末试卷(含解析)
- 第2章习题答案
- 趣字当先 旨在知情意行- 盐城教育网--首页
- A组 2013年“安全生产月”活动建筑工人安全生产知识竞赛复习题1
- 1.5电势差翻转课堂
- 连云港市政府关于印发连云港市城乡居民基本医疗保险办法的通知
- 马鞍山市马钢公司姑山铁矿 - 图文
- 2018全球与中国市场烷基酚醛树脂深度研究报告(目录) - 图文
- 低温甲醇洗
- 上海卫生人才网:2014上海长宁区虹桥街道社区卫生服务中心招聘信息
- 化学必修一期末测试题
- 北京市建筑施工高处作业吊篮安全监督管理规定-京建法〔2014〕4号
- 说明方法修辞手法练习题
- 质量管理体系运行考核办法
- 2011山东烟台中考数学(word,含答案)
- 十种排序算法比较
- DELL - vostro-2421 - 拆机详解 - 图文