zoukankan      html  css  js  c++  java
  • 没事的时候写个触发器

    --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

  • 相关阅读:
    vmware克隆Centos6.4虚拟机网卡无法启动问题
    mysql错误:Statement violates GTID consistency
    /etc/vsftpd.conf详解
    Linux /etc/fstab文件
    sudo命令详解
    linux fack 文件系统修复命令
    ORA-01502: 索引或这类索引的分区处于不可用状态
    Oracle 完整性约束错误
    linux下部署redis
    Python 发送邮件案例
  • 原文地址:https://www.cnblogs.com/majoruser/p/7826376.html
Copyright © 2011-2022 走看看