北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

SQL Server的触发器实现,确保当`cqctype为外发加工


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); -- 将收到错误提示并回滚


> 注意:触发器执行在事务内,任何违反规则的操作都会导致整个操作失败。建议在应用层也添加相应校验以提高用户体验。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言