没事的时候写个触发器

--T-SQL创建销售数据库,并创建产品分类表、用户表、产品表和销售表。
create database Sales
go

use Sales
go

--分类表(分类号(主键、标识列)、分类名(不为空))
create table Category
(
CateID int primary key identity(1,1),
CateName nvarchar(50) not null
)
go
--用户表(用户号(主键、标识列)、用户名(不为空)、密码(默认123)、电话)
create table Users
(
UserID int primary key identity(1,1),
UserName nvarchar(50) not null,
Pass nvarchar(50) default '123',
Tel nvarchar(50)
)
go

--产品表(产品号(主键、标识列)、产品名(不为空)、单价(>=0)、库存(>=0)、所属分类)
create table Product
(
ProdutID int primary key identity(1,1),
ProductName nvarchar(50) not null,
UnitPrice decimal(6,1) check(UnitPrice>=0),
KuCun int check(KuCun>=0),
CateID int references Category(CateID)--外键
)
go

--销售表(销售编号(主键、标识列)、用户号(不为空),产品号(不为空),数量(不为空)、小计)
create table Sell
(
SellID int primary key identity(1,1),
UserID int references Users(UserID),--用户号,外键
ProductID int references Product(ProdutID),--产品号,外键
Quantity int default 1,--数量
Total money--小计
)
go

--创建4个存储过程,分别向4张表插入记录
--添加分类的存储过程
create proc p_InsertCate
(
@cname nvarchar(50)
)
as
insert into Category values(@cname)
go

exec p_InsertCate '生活用品'
go

--添加用户的存储过程
create proc p_InsertUser
(
@name nvarchar(50)
)
as
insert into Users(UserName) values(@name)
go

exec p_InsertUser 'cc'
go

--添加产品的存储过程
create proc p_InsertProduct
(
@name nvarchar(50),--产品名
@danjia decimal(6,1),--单价
@cun int,--库存
@cid int--分类ID
)
as
insert into Product values(@name,@danjia,@cun,@cid)
go

--调用存储过程向产品表插入记录
exec p_InsertProduct '黄鹤楼',60,200,3
go

--添加销售记录的存储过程
create proc p_InsertSell
(
@uid int,--用户编号
@pid int,--产品编号
@num int --购买数量
)
as
insert into Sell(UserID,ProductID,Quantity) values(@uid,@pid,@num)
go

--************************触发器***************************************
--在分类表中定义触发器,当插入纪录时弹出消息:你已经向分类表里插入了一条纪录,然后向分类表插入记录触发
create trigger t_InsertCate
on Category--on后接第一步操作用的表,即触发器是建立在该表上的
for insert --for后接触发器类型,由第一步操作决定
as--as后接的是触发器的工作,即第一步后自动完成的后续操作
print '你已经向分类表里插入了一条纪录'
go

--向分类表插入记录,自动触发t_InsertCate
insert into Category values('数码用品')
exec p_InsertCate '家电'
go

--创建插入型触发器,要求在产品表中插入一条数据同时读取临时表中的这条记录
create trigger t_InsertProduct
on Product
for insert
as--插入型触发器产生的临时表是:inserted,永远只保存一条记录,为刚插入的新数据
select * from inserted--从临时表中读取刚刚插入的记录
go

--向产品表插入记录,触发t_InsertProduct,自动读取inserted表
insert into Product values('冰箱',5000,30,7)
exec p_InsertProduct '空调',6000,10,7
go


--创建删除型触发器,要求在删除分类表一条数据时,读取临时表中的记录
create trigger t_DeleteCate
on Category
for delete
as--删除型触发器产生的临时表是:deleted,永远只保存一条记录,为刚删除的旧数据
select * from deleted--从临时表中读取刚刚删除的记录
go

--删除分类表记录,触发t_DeleteCate
delete Category where CateID=6
go

--创建更新型触发器,要求在更新分类表一条数据时,读取临时表中的记录,并调用存储过程触发
create trigger t_UpdateCate
on Category
for update
as--更新型触发器产生的临时表有两张:inserted,deleted
select * from inserted-- 保存的是更新后的新数据
select * from deleted--保存的是更新前的旧数据
go

update Category set CateName='数码' where CateID=6
go

--修改触发器
alter trigger t_InsertCate
on Category
for insert
as
print '你已经向分类表里插入了一条纪录'
select * from inserted
go

exec p_InsertCate '球'
go

--禁用触发器
alter table Category
disable trigger t_InsertCate
go

--启用触发器
alter table Category
enable trigger t_InsertCate
go

--删除触发器
drop trigger t_InsertCate
go

drop trigger t_DeleteCate
go

--再创建一个触发器,用于分类表里删除一条纪录时,
--同时也删除产品表里对应类别的产品信息,后调用存储过程触发。
create trigger t_DeleteCate
on Category
for delete
as
delete Product where CateID=(select CateID from deleted)
go
delete Category where CateID=1
go

--销售一件产品时,同时更新它的小计价钱和相应产品的库存
alter trigger t_InsertSell
on Sell
for insert
as
--局部变量,分别表示刚卖产品的销量、产品号、单价、销售号、库存
declare @shu int,@pid int,@dan decimal(6,1),@sid int,@ku int
set @sid=(select SellID from inserted)--获取刚卖产品的销售编号
set @pid=(select ProductID from inserted)--获取刚卖产品的产品编号
set @shu=(select Quantity from inserted)--获取刚卖产品的销量
set @dan=(select UnitPrice from Product where ProdutID=@pid)--获取刚卖产品的单价
set @ku=(select KuCun from Product where ProdutID=@pid)--获取刚卖产品的库存
if @shu<=@ku--如果销量小于等于库存,才能销售并更新相关数据
begin
--更新刚卖产品的小计价钱
update Sell set Total=@shu*@dan where SellID=@sid
--更新刚卖产品的库存:库存减少
update Product set KuCun=KuCun-@shu where ProdutID=@pid
end
else--否则,提示库存不足,并回滚撤消上一步的插入操作
begin
print '库存不足!'
rollback transaction--回滚
end
go

insert into Sell(UserID,ProductID,Quantity) values(2,9,11)
go

exec p_InsertSell 2,1,10
go

posted on 2017-11-13 15:00  MajorUser  阅读(118)  评论(0编辑  收藏  举报

导航