建网站费用,国内广告公司排名,苏州万浩伟网络科技有限公司,软件商店安装最新版下载创建触发器 是特殊的存储过程#xff0c;自动执行#xff0c;一般不要有返回值 类型#xff1a; 1.后触发器 #xff08;AFTER,FOR#xff09;先执行对应语句#xff0c;后执行触发器中的语句 2.前触发器 并没有真正的执行触发语句#xff08;insert#xff0c;update…创建触发器 是特殊的存储过程自动执行一般不要有返回值 类型 1.后触发器 AFTER,FOR先执行对应语句后执行触发器中的语句 2.前触发器 并没有真正的执行触发语句insertupdate,delete而是执行触发后的语句 3.行级触发器 FOR EACH ROW 在SQL server 中不存在 商品号为1的库存量 1.后触发器实现不同表之间的约束 --实现在销售量不大于库存量时每卖出n件商品对应商品的库存要减n若销售量大于库存量则回滚此次操作
IF EXISTS (SELECT *FROM sysobjects WHERE nametr_SaleCommodity)DROP TRIGGER tr_SaleCommodity
GO
CREATE TRIGGER tr_SaleCommodity
ON OrderInfo FOR INSERT --FOR/AFTER为后触发器
ASBEGINIF EXISTS (SELECT * FROM inserted I INNER JOIN CommodityInfo C ON I.CommodityIdC.CommodityIdWHERE I.AmountC.Amount)BEGINROLLBACK --后触发器PRINT 商品的销售量大于商品的库存量END ELSEBEGINUPDATE CommodityInfoSET AmountAmount-(SELECT Amount FROM inserted)WHERE CommodityId IN(SELECT CommodityId FROM inserted)ENDEND
GO 执行 INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
VALUES(YOUYOU,1,10,600,网上银行,2014-11-11 00:00:00.000,1,1) 结果 注意1.上一行为销售记录下一行为商品1的信息 2.卖出10个库存量由48变为38 3.可以看出以上的销售记录中的Paymoney是不正确的它的值应该是Amount*OutPrice10*300所以需要前触发器来约束 2.前触发器可以实现行级触发器功能 --实现了日期校验和支付金额的计算
IF EXISTS(SELECT* FROM sysobjects WHERE nametr_DateConfim)DROP TRIGGER tr_DateConfim
GO
CREATE TRIGGER tr_DateConfim
ON OrderInfo INSTEAD OF INSERT ,UPDATE
ASBEGINDECLARE date datetimeSELECT dateOrderTime FROM insertedIF date BETWEEN 2012-1-1 AND 2015-1-1BEGINDECLARE UserId varchar(20) ,CommodityId int,Amount int,PayMoney money,PayWay varchar(20),OrderTime datetime,Confirm int,SendGoods intSELECT UserIdUserId,CommodityIdCommodityId,AmountAmount,PayWayPayWay,OrderTimeOrderTime,ConfirmConfirm,SendGoodsSendGoods FROM insertedDECLARE outPrice moneySELECT outPriceOutPrice FROM CommodityInfo WHERE CommodityIdCommodityIdSET PayMoneyoutPrice*AmountPRINT inserted 中的数据CONVERT(varchar(20),UserId) CONVERT(varchar(20),CommodityId) CONVERT(varchar(20),Amount) CONVERT(varchar(20),PayMoney) CONVERT(varchar(20),PayWay) CONVERT(varchar(20),OrderTime) CONVERT(varchar(20),Confirm) CONVERT(varchar(20),SendGoods) CONVERT(varchar(20),outPrice)INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)SELECT UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM insertedENDELSE PRINT 你插入的数据中的时间只能在 2012-1-1 到 2015-1-1 中间END
GO 执行 INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)
VALUES(YOUYOU,1,5,网上银行,2013-1-11,1,1) 注意这里插入时我并没有定义PayMoneyPayMoney是通过触发器来自动计算的 结果 日期不正确 日期正确 打印信息对应UserId CommodityId Amount PayMoney PayWay OrderTime Confirm SendGoods outPrice 3.行级触发器错误 执行结果 可以看出在SQL server中并不支持行级触发器转载于:https://www.cnblogs.com/feiquan/p/8685722.html