使用触发器控制用户删除业务往来中使用的基础资料
使用触发器控制用户删除业务往来中使用的基础资料
比如说货品资料,如果这个货品有了业务上的往来,比如采购和销售单使用该货品,在基础资料就不能删除该货品,这样的约束如何实现?
有下面两种常见处理方式:
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

什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
