IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 触发器习题代码 -> 正文阅读

[大数据]触发器习题代码

--针对bookshop数据库,完成以下操作:
--1、针对employee表写一个DELETE触发器,显示删除的员工人数。

create trigger employee_delete?
on employee
for delete
as
? ?select count(*) from deleted

--测试
delete?
from employee
where emp_no not in (select sale_id from sales)

select * from employee


--2、针对employee表写一个UPDATE触发器,限制每次工资额的变动不能超过原工资的20%。

go
create trigger upda_emp on employee
after update
as
if exists(
?? ?select * from inserted a,deleted b
?? ?where a.emp_no=b.emp_no?
?? ?and abs(a.salary-b.salary)>0.2*b.salary )
begin
print'员工工资变动不能超过20%'
rollback
end
--测试代码
select *from employee

update employee
set salary=1.4*salary
where ?emp_no='E0001'


update employee
set salary=1.4*salary

update employee
set salary=1.1*salary
where ?emp_no='E0001'


update employee
set salary=1.1*salary

--3、定义一个触发器,保证新添加的员工的工资不能超过5000元

go
create trigger employee_insert on employee
for insert
as
? if exists(select * from inserted where salary>5000) --新添加的员工的工资超过5000
? begin
? ? ?rollback
?? ? print ?'新增员工工资不能超过5000'
? end
--测试

select * from employee
insert employee values('E0001','王大华','男','业务','经理','1976-10-13','1951-08-01',4000,'13107912134','上海市')
insert employee values('E0001','王大华','男','业务','经理','1976-10-13','1951-08-01',80000,'13107912134','上海市')


--4、对sale_item表创建一个触发器,当插入一条销售明细记录时,如果该记录的产品数量超过5,则显示“欢迎成为本公司的VIP会员!”

go
create trigger sale_item_insert on sale_item
for insert
as
? ?declare @cnt int
? ?select @cnt=qty from inserted
? ?if (@cnt>5) print '欢迎成为本公司的VIP会员!'
--测试

insert into sale_item values('102898','43748 ',6,100)

--5、定义一个触发器,当修改sale_item表中的销售数量或者价格时,自动更新sales表中的订单金额。

go
create trigger sale_item_upd on sale_item
for update
as
if update(qty) or update(unit_price) --如果修改了销售数量或者价格
? ?begin
? ? ? update sales
?? ? ?set total_amt=(select sum(qty*unit_price)?
?? ? ? ? ? ? ? ? ? ? from sale_item?
?? ??? ??? ??? ??? ? where sale_item.order_no=sales.order_no)
? ?end


select order_no, total_amt from sales
select * from sale_item

update sale_item
set qty=2
where order_no='102893' and book_no='20652'

select order_no,sum(qty*unit_price)?
from sale_item ?
group by order_no

--6、定义一个触发器,实现对sales表的级联删除操作。

go
create trigger sales_del ?on sales
instead of delete
as
?--实现级联删除
? begin
? ? delete sale_item where order_no in(select order_no from deleted)
? ? delete sales where order_no in(select order_no from deleted)
? end

--测试
delete sales
where order_no='102898'

select * from sales
select * from sale_item


--7、定义一个触发器,实现对books表中图书编号修改的的级联更新操作。
--由于sale_item表中book_no列不允许为空,该题无法实现--8、定义一个触发器,实现对books表的级联删除操作。

go
create trigger books_upd ?on books
instead of delete
as
?--实现级联删除
? begin
? ? delete sale_item where book_no in(select book_no from deleted)
? ? delete books where book_no in(select book_no from deleted)
? end

--测试
select * from books
select * from sale_item

delete from books
where book_no='20652'


--课堂练习:对于数据库bookshop,创建一个instead of触发器,实现对员工信息(employee表)的级联删除。

go
create trigger del_emp on employee
instead of delete
as
?? ?delete sale_item?
?? ?where order_no in (
?? ??? ?select order_no
?? ??? ?from sales
?? ??? ?where sale_id in (
?? ??? ??? ??? ?select emp_no
?? ??? ??? ??? ?from deleted
?? ??? ??? ??? ?)
?? ??? ?)
?? ?delete sales?
?? ?where sale_id in (
?? ??? ?select emp_no
?? ??? ?from deleted
?? ??? ?)
?? ?delete employee?
?? ?where emp_no in (
?? ??? ?select emp_no
?? ??? ?from deleted
?? ??? ?)


--附加题:针对employee表,定义一触发器用来保证参照完整性
?

go
create trigger emp_upd_del ?on employee
instead of update
as
if not exists(select * from inserted) --如果做删除,实现级联删除
? begin
? ? delete sale_item where order_no in(select order_no from sales where sale_id in(select emp_no from deleted))
?? ?delete sales where sale_id in(select emp_no from deleted)
? ? delete employee where emp_no in(select emp_no from deleted)
? end
else ? --如果做修改
? begin
? ? if update(emp_no)--如果修改了主健值,则实现级联修改
? ? ? ?begin
? ? ? ? ? update sales set sale_id=(select emp_no from inserted) where sale_id in(select emp_no from deleted)
? ? ? ? ? update employee set emp_no=(select emp_no from inserted) where emp_no in(select emp_no from deleted)
? ? ? end
? end

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:50:07  更:2021-12-02 16:50:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:12:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码