使用触发器控制用户删除业务往来中使用的基础资料
本文转载:http://www.csframework.com/archive/1/arc-1-20120526-1945.htm
比如说货品资料,如果这个货品有了业务上的往来,比如采购和销售单使用该货品,在基础资料就不能删除该货品,这样的约束如何实现?
有下面两种常见处理方式:
1. 在DAL层的Delete方法中控制,删除前查询业务往来表,如果有使用该基础资料就抛出异常终止删除。
2. 使用DELETE触发器实现。
3. 使用主外键约束
下面是使用触发器实现的代码:
ALTER TRIGGER trg_DropProduct
ON dbo.tb_Product AFTER DELETE
AS
BEGIN
/*********************************************************************************
货品资料删除触发器,by www.csframework.com
--------------------------------------------------
SELECT * FROM tb_Product
SELECT * FROM dbo.tb_IAs
INSERT INTO tb_Product(ProductCode) VALUES ('BBX')
DELETE tb_Product WHERE ProductCode='BBX'
DELETE tb_Product WHERE ProductCode='XX'
DELETE tb_Product WHERE ProductCode='cpu'
**********************************************************************************/
DECLARE @ProductCode VARCHAR(20),@MSG NVARCHAR(200)
SELECT @ProductCode=ProductCode FROM DELETED
SELECT @ProductCode=ISNULL(@ProductCode,'')
SELECT @MSG='该货品在业务往来表中使用,不可以删除!'
IF EXISTS(SELECT * FROM dbo.tb_IAs WHERE ProductCode=@ProductCode) GOTO ERR --检查库存调整
IF EXISTS(SELECT * FROM dbo.tb_ICs WHERE ProductCode=@ProductCode) GOTO ERR --检查库存盘点
IF EXISTS(SELECT * FROM dbo.tb_INs WHERE ProductCode=@ProductCode) GOTO ERR --检查入库
IF EXISTS(SELECT * FROM dbo.tb_IOs WHERE ProductCode=@ProductCode) GOTO ERR --检查出库
IF EXISTS(SELECT * FROM dbo.tb_POs WHERE ProductCode=@ProductCode) GOTO ERR --检查采购订单
IF EXISTS(SELECT * FROM dbo.tb_SOs WHERE StockCode =@ProductCode) GOTO ERR --检查销售订单
GOTO FINISHED
--标签:业务往来中使用该货品
ERR:
ROLLBACK TRANSACTION
RAISERROR(@MSG,10,1)
--事务完成标签:不做任何处理
FINISHED:
END
作者:阿笨
【官方QQ一群:跟着阿笨一起玩NET(已满)】:422315558
【官方QQ二群:跟着阿笨一起玩C#(已满)】:574187616
【官方QQ三群:跟着阿笨一起玩ASP.NET(已满)】:967920586
【官方QQ四群:Asp.Net Core跨平台技术开发(可加入)】:829227829
【官方QQ五群:.NET Core跨平台开发技术(可加入)】:647639415
【网易云课堂】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628
【腾讯课堂】:https://abennet.ke.qq.com
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:微信搜索:跟着阿笨一起玩NET