博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
触发器学习
阅读量:5221 次
发布时间:2019-06-14

本文共 2740 字,大约阅读时间需要 9 分钟。

--创建销售表

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME ='SALES')
DROP TABLE SALES
CREATE TABLE SALES --销售表
(
  SAID  INT IDENTITY(1,1) NOT NULL,
  BREED VARCHAR(40) NOT NULL,
  PURCHASE VARCHAR(40) NULL,
  QUANTITY INT NULL,
  PRICE MONEY NULL,
  AMOUNT MONEY NULL
)
SELECT * FROM SALES

--创建库存表

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = 'STOCKINDTL')
DROP TABLE STOCKINDTL
CREATE TABLE STOCKINDTL
(
  BREED VARCHAR(40) PRIMARY KEY NOT NULL,
  QUANTITY INT NULL,
  PRICE MONEY NULL,
  AMOUNT MONEY NULL
)
SELECT * FROM STOCKINDTL

--当向库存表插入数据的时候自动算出金额
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'INSERT_STOCKINDTL' )
DROP TRIGGER INSERT_STOCKINDTL
CREATE TRIGGER INSERT_STOCKINDTL
ON STOCKINDTL
FOR INSERT
AS
BEGIN TRANSACTION
UPDATE STOCKINDTL SET AMOUNT = I.QUANTITY * I.PRICE FROM STOCKINDTL S,INSERTED I WHERE S.BREED = I.BREED
COMMIT TRANSACTION

INSERT INTO STOCKINDTL(BREED,QUANTITY,PRICE) VALUES('金威啤酒',10000,3.8)

INSERT INTO STOCKINDTL(BREED,QUANTITY,PRICE) VALUES('青岛啤酒',10000,3.8)

 

--创建触发器,当向销售表插入数据的时候,同时库存表要做相应的减少

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'INSERT_SALES')
DROP TRIGGER INSERT_SALES
GO
CREATE TRIGGER INSERT_SALES
ON SALES
FOR INSERT
AS
BEGIN TRANSACTION
   --检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
   IF NOT EXISTS (SELECT QUANTITY FROM STOCKINDTL WHERE BREED IN (SELECT BREED FROM INSERTED))
   BEGIN
     RAISERROR('错识!,该商品不存在库存!不能销售',16,1)
     ROLLBACK
     RETURN
   END
   IF EXISTS (SELECT QUANTITY FROM STOCKINDTL WHERE BREED IN (SELECT BREED FROM INSERTED) AND QUANTITY <=0)
   BEGIN
     RAISERROR('错识!,该卷烟库存小于等于0,不能销售',16,1)
     ROLLBACK
     RETURN
   END

   DECLARE @BREED VARCHAR(40)

   SELECT  @BREED = BREED FROM INSERTED

   DECLARE @SAQUANTITY INT  -- 要销售的数量

   SELECT  @SAQUANTITY = QUANTITY FROM INSERTED

   DECLARE @STQUANTITY INT  -- 库存的数量

   SELECT  @STQUANTITY = QUANTITY FROM STOCKINDTL

   -- 检查销售数量大于库存数量

   IF(@SAQUANTITY > @STQUANTITY)
   BEGIN
   RAISERROR('错识!,销售数量不能大于库存数量',16,1)
   ROLLBACK
   RETURN
   END
 
   --对合法的数据进行处理
   UPDATE SALES SET AMOUNT = QUANTITY * PRICE  WHERE BREED IN (SELECT BREED FROM INSERTED)
   UPDATE STOCKINDTL SET QUANTITY = QUANTITY - @SAQUANTITY, AMOUNT = ( QUANTITY - @SAQUANTITY) * PRICE WHERE BREED = @BREED
COMMIT TRANSACTION
GO

 

--测试向销售表插入一条数据
INSERT INTO SALES(BREED,PURCHASE,QUANTITY,PRICE) VALUES('青岛啤酒','LIDAOHUA',5,3.8)       --符合业务逻辑的数量
INSERT INTO SALES(BREED,PURCHASE,QUANTITY,PRICE) VALUES('金威啤酒','LIDAOHUA',5,3.8)

INSERT INTO SALES(BREED,PURCHASE,QUANTITY,PRICE) VALUES('白沙烟','LIDAOHUA',25,3.8)       --不存在这个商品的情况

INSERT INTO SALES(BREED,PURCHASE,QUANTITY,PRICE) VALUES('金威啤酒','LIDAOHUA',10000,3.8)  --销售数量大于库存数量

 

--查询数据

SELECT * FROM SALES
SELECT * FROM STOCKINDTL

--清空表的数据

TRUNCATE TABLE SALES
TRUNCATE TABLE STOCKINDTL

 

转载于:https://www.cnblogs.com/PatrickLee/archive/2012/07/24/2606364.html

你可能感兴趣的文章
mongo
查看>>
取得类的 对象属性名 和类的属性 和类的方法名
查看>>
Spring报错——Scope 'session' is not active for the current thread
查看>>
C++学习笔记(三)之函数库
查看>>
[Android]2013.5.4日志
查看>>
[HTML5]手机屏幕分辨率和浏览器分辨率
查看>>
Spring各个jar包的简介
查看>>
POJ 3180 The cow Prom Tarjan基础题
查看>>
LeetCode | Find Minimum in Rotated Sorted Array II
查看>>
XHTML
查看>>
js全选与反选
查看>>
php三种方式操作mysql数据库
查看>>
多态性的使用
查看>>
AngularJs学习总结-了解基本特性(-)
查看>>
Your Firefox profile cannot be loaded. It may be missing or inaccessible
查看>>
Java Web应用程序的规范目录结构
查看>>
Java 博客系统 Tale
查看>>
Inside Microsoft SQL Server 2008: T-SQL Querying 读书笔记1
查看>>
POJ-2992 Divisors
查看>>
JavaScript-学习一_var
查看>>