业务场景
用户在根据发货单生成出库时增加校验规则:上游表单的一个表头自定义项规定下游表单表体的某个批次属性(自定义项)的范围,如果表头自定义项为M或H或P开头,则表体的批次属性应在此范围内,如:表头M01/M02/M03,则表体每条数据的批次属性都应为M01或M02或M03;
触发器学习
基本语法格式
触发器格式为:
create trigger [触发器名称]
on [表名]
[触发阶段] of [目标语句类型]
as
declare [声明属性(若干,用 , 隔开)];
select [为属性赋值]
-----触发逻辑
go
- 触发阶段:instead of/ for /after :在替代语句执行/在语句执行后,校验保存一般用for
- 目标语句类型:insert/update/delete:规定触发触发器的语句类型
语句编写
--drop trigger if exists record32_orderCode2_rule;
create trigger record32_orderCode2_rule
on dbo.rdrecords32
for insert,update
as
declare @cbdlcode varchar(255),--发货单单号,->出库单子表关联发货单
@cBatchProperty8 varchar(255),--表体批次属性8(采购订单号)
@cDefine14 varchar(255);--表头自定义属性14(生产单号2)
select @cbdlcode =cbdlcode from inserted;
select @cBatchProperty8 = cBatchProperty8 from inserted;
select @cDefine14 =cDefine14 from DispatchList where cDLCode =@cbdlcode;
if (@cDefine14 like '%M%' or @cDefine14 like '%H%' or @cDefine14 like '%P%')
and @cDefine14 not like concat('%',@cBatchProperty8,'%')
-- and (@cBatchProperty8 like '%M%' or @cBatchProperty8 like '%H%' or @cBatchProperty8 like '%P%')
begin
print '出库产品采购订单号不在"生产订单2"所规定范围内,不允许保存'
rollback tran
end
else print'保存出库单子表数据'
go
结果测试
测试语句1:设置发货单(上游)为 表头自定义项=M01,出库单表体批次属性 = M01
update DispatchList set cDefine14 = 'M01' where cDLCode='0000000003';
update rdrecords32 set cBatchProperty8 = 'M01' where cbdlcode='0000000003';
结果:
测试语句2:设置发货单(上游)为 表头自定义项=M01,出库单表体批次属性 = S01
update rdrecords32 set cBatchProperty8 = 'S01' where cbdlcode='0000000003';
结尾
触发器一般是客开满足不了时加入的小需求,本地日常测试环境测试完成后应该禁用掉:
禁用:
ALTER TABLE trig_example DISABLE TRIGGER trig1
GO
恢复:
ALTER TABLE trig_example ENABLE TRIGGER trig1
GO