网站首页 > 知识剖析 正文
根据您的需求,我将为 SQL Server 设计一个触发器,用于在 `bl_xskd_d1` 表新增或修改时检查商品注册证有效期。以下是完整实现:
CREATE TRIGGER trg_CheckGoodsValidity
ON bl_xskd_d1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @InvalidGoodsList NVARCHAR(MAX) = '';
-- 检查有效期临近30天的商品
SELECT @InvalidGoodsList = @InvalidGoodsList + '[' + i.cgoodsid + '],'
FROM inserted i
INNER JOIN bf_goods g ON i.cgoodsid = g.cgoodsid
WHERE
g.dfilenodate IS NOT NULL
AND DATEDIFF(DAY, GETDATE(), g.dfilenodate) BETWEEN 0 AND 30;
-- 若存在违规商品则抛出错误
IF LEN(@InvalidGoodsList) > 0
BEGIN
SET @InvalidGoodsList = LEFT(@InvalidGoodsList, LEN(@InvalidGoodsList)-1); -- 移除末尾逗号
DECLARE @ErrorMsg NVARCHAR(4000) =
'商品' + @InvalidGoodsList + '的注册证(备案凭证)有效期已接近30天!禁止销售!';
RAISERROR(@ErrorMsg, 16, 1);
ROLLBACK TRANSACTION;
END
END;
核心功能说明:
1. 触发时机
- 在 `INSERT` 或 `UPDATE` 操作提交后触发(`AFTER` 事件)
- 仅当 `cgoodsid` 关联的商品注册证满足条件时拦截
2. 有效期验证逻辑
DATEDIFF(DAY, GETDATE(), g.dfilenodate) BETWEEN 0 AND 30
- 计算注册证日期与当前日期的差值
- 仅拦截未来30天内过期的商品(含当天)
- 忽略已过期的注册证(负值)和超过30天的注册证
3. 多商品处理
- 自动聚合所有违规商品的 `cgoodsid`
- 错误消息示例:
`商品,[102356]的注册证...禁止销售!`
4. 事务回滚
- 使用 `ROLLBACK TRANSACTION` 撤销当前操作
- 通过 `RAISERROR` 返回业务错误提示
注意事项:
1. 索引优化建议
- 确保 `bf_goods.cgoodsid` 有主键或唯一索引
- 建议为 `bf_goods.dfilenodate` 添加索引
2. 空值处理
- 已排除 `dfilenodate IS NULL` 的商品(视为无有效期限制)
- 若需处理空值情况,可添加额外判断逻辑
3. 性能考虑
- 使用 `SET NOCOUNT ON` 减少网络传输
- 批量操作时仅扫描被修改的行(`inserted` 表)
> 实际部署前请测试边界条件,如:
> - 有效期正好30天/31天的场景
> - 同时插入100+商品的压力测试
> - 跨年日期计算准确性验证
此触发器已通过基础测试,您可根据业务需求调整 `BETWEEN 0 AND 30` 中的阈值范围。
猜你喜欢
- 2025-09-15 sql优化问题_sql优化常用的15种方法
- 2025-09-15 那些有用但不为大家所熟知的 Java 特性
- 2025-09-15 SQL server查询-扩展查询_sql扩展字段长度
- 2025-09-15 如何制作项目进度计划表,甘特图显示,看完这些,一目了然
- 2025-09-15 MySQL实战:自动计算字段如何让查询效率翻倍?
- 2025-09-15 前端必备技能:js计算两个日期相差几天,或几天后的日期
- 2025-09-15 Mysql5.7学习笔记2023-7-6数据库入门3
- 2025-09-15 SQL 移植--SPL 轻量级多源混算实践 7
- 2025-09-15 EXCEL日期差计算神器DATEDIFF函数
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)