CREATE TRIGGER trg_CheckVendorId_BlQcStock
ON bl_qcstock
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (
SELECT 1
FROM INSERTED
WHERE cqctype = '外发加工'
AND (cvenderid IS NULL OR LTRIM(RTRIM(cvenderid)) = '')
)
BEGIN
RAISERROR('错误:当cqctype为"外发加工"时,cvenderid不能为空!', 16, 1);
ROLLBACK TRANSACTION;
END
END;
触发器说明:
1. 触发时机:`AFTER INSERT, UPDATE`
在插入或更新操作后触发,确保数据变更时进行校验。
2. 核心校验逻辑:
- 检查`INSERTED`虚拟表中所有`cqctype = '外发加工'`的记录
- 验证`cvenderid`是否为空或空白字符串(使用`LTRIM(RTRIM)`处理空格)
3. 错误处理:
- 发现违规数据时,通过`RAISERROR`抛出明确错误信息
- 执行`ROLLBACK TRANSACTION`回滚整个事务,阻止数据变更
4. 关键特性:
- 使用`SET NOCOUNT ON`避免干扰客户端计数
- 高效检查`EXISTS`而非全表扫描
- 同时处理多行数据操作(批量操作场景)
使用示例
-- 测试1:合法数据(允许通过)
UPDATE bl_qcstock
SET cqctype = '外发加工', cvenderid = 'V1001'
WHERE id = 1;
-- 测试2:非法数据(触发错误)
INSERT INTO bl_qcstock (cqctype, cvenderid)
VALUES ('外发加工', NULL); -- 将收到错误提示并回滚
> 注意:触发器执行在事务内,任何违反规则的操作都会导致整个操作失败。建议在应用层也添加相应校验以提高用户体验。