本文转载: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