--1定义一触发器,要求当订货数量超过该产品库存数量时,拒绝订货,同时给出提示信息。
create trigger t3 on OrderDetails
for insert
as
begin
declare @stocks int,@quantity int
select @quantity=quantity from inserted
select @stocks=stocks from products,inserted where products.productid=inserted.productid
if @quantity>@stocks
begin
rollback transaction
raiserror('库存量不足!',16,1)
end
end
--测试触发器
insert into OrderDetails values('01','01','12',null)
select * from OrderDetails
--2.创建一触发器,要求当删除orders表中的记录时,自动把订单详细信息表中的相关记录删除.
create trigger t4 on orders
for delete
as
declare @orderid int
select @orderid=orderid from deleted
print '开始查找并删除表orderdetails中的相关记录。。。。'
delete from orderdetails where
print '删除表orderdetails中的的相关记录条数为'+str(@@rowcount)+'条'
--测试触发器
delete from orders where orderid='1' (注:测试之前要把相关表的关联删除)
--3.创建一触发器,要求当客户订货时(即在订单详细信息表中插入记录时),自动修改产品信息表中的库存量.
create trigger t5 on orderdetails
for insert
as
update products set stocks=stocks-quantity from products,inserted where products.productid=inserted.productid
--测试触发器
insert into orderdetails values('02','01','5',null)
select * from products where productid='01'
--4.你在开发某公司的管理信息系统,其中要跟踪经理的购买情况。每个经理在预算表中都有一个记录。
--预算表包含列“经理代号”、列“预算总金额”、列“现有预算金额”;
--购买表包含列“购买代号”、列“购买金额”,列“经理代号”。
--每次购买都要与“现有预算金额”作比较,当该次购买的“购买金额”小于“现有预算金额”时,
--才允许插入到购买表中(一次购买只插入一个记录),同时自动更改预算表的“现有预算金额”。
--请在购买表上编写一个触发器,完成该任务。
CREATE TRIGGER t1 ON 购买表
FOR INSERT
AS
BEGIN
IF (SELECT count(*) FROM Inserted) <> 1
BEGIN
RAISERROR('一次购买只允许插入一个记录!',16, 1)
ROLLBACK TRANSACTION
RETURN
END
IF ( SELECT a.现有预算金额-b.购买金额
FROM 预算表 AS a INNER JOIN
Inserted AS b ON a.经理代号=b.经理代号)<0
BEGIN
RAISERROR('现有预算金额不足支付购买金额 !',16, 1)
ROLLBACK TRANSACTION
RETURN
END
UPDATE 预算表
SET 现有预算金额 = a.现有预算金额-b.购买金额
FROM 预算表 AS a INNER JOIN
Inserted AS b ON a.经理代号=b.经理代号
END
--5.假设你在开发一个图书馆管理系统,借阅者表中存储了‘借书证号’、‘姓名’、‘类型’、‘可借本数’、‘借阅期限’等信息,
--借书表中存储了‘借书证号’、‘图书编号’、‘借书日期’、‘应还日期’等,还书表中存储了‘借书证号’、‘图书编号’、
--‘还书时间’、‘是否超期’、‘罚款金额’,请你编写触发器:
--(1)学生可借书数量为5本,当某学生累计借书超过5本时限制其借书
create trigger t2 on 借书表 for insert
as
declare @k int
declare @j int
select @k=可借本数 from 借阅者表,inserted where 借阅者表.借书证号=inserted.借书证号
select @j= Count(*) from 借书表,inserted where 借书表.借书证号=inserted.借书证号
if(@j >@k )
begin
rollback transaction
print'累计借阅数量超过可借本数!'
end
--(2)如果还书时超期,自动计算其罚款金额(按每天0.5元计算)
create trigger t3 on 还书表 after insert
as
declare @y datetime
declare @h datetime
declare @t int
select @y= 应还日期 from 借书表, inserted where 借书表.图书编号=inserted.图书编号 and 借书表.借书证号=inserted.借书证号
select @h =还书时间 from inserted
set @t=DATEDIFF(dd,@y ,@h )
if(@t>0)
update 还书表 set 罚款金额 from 还书表,inserted where
还书表.借书证号=inserted.借书证号 and 还书表.图书编号=inserted.图书编号
--6. 假设你在开发一个商务网站,管理员在进行后台订单处理时,对已成交的订单要实现自动修改其商品库存数量,
--请编写触发器实现该功能。(数据库参考mobile1)
create trigger t4 on orderdetail for update
as
if update(status)
update product set product.quantity=product.quantity-inserted.quantity from product,inserted
where product.productid=inserted.productid
update orderdetail set status=1 where orderid='38' and productid='11'