查询分析器里好像是按顺序一条一条的执行,但在数据库内部呢?我用的生产系统有一个BUG,就是物品档案里的编码进行统一转换时,会把所以数据表里用到某个编码的地方,全转换为新的编码...
查询分析器里好像是按顺序一条一条的执行,但在数据库内部呢?
我用的生产系统有一个BUG,就是物品档案里的编码进行统一转换时,会把所以数据表里用到某个编码的地方,全转换为新的编码,同时去掉老编码,偏偏漏掉了一个BOM表。所以我做了个简单的触发器。关系到4个表。
如下:BOM表和生产计划明细表各有一个触发器,如果有修改,调存储过程重新生成投产安排表,物品档案表里建一个简单触发器,当编码进行转换,软件在更新数据库其他表(包含有生产计划明细表和投产安排表)的物品编码时,物品档案中的触发器同时更新BOM表里的编码。但由于BOM中和生产计划明细表的触发器是在编码变化时,重新生成投产安排。因此,这里重复更新了投产安排。我的要求是不能由BOM和生产计划明细的触发器重新生成。
触发器如下:
CREATE Trigger [转换编码]
On 物料档案
for update
AS
if update(物品编码)
BEGIN
ALTER TABLE BOM DISABLE TRIGGER all --禁用BOM表上的触发器
ALTER TABLE 生产计划明细 DISABLE TRIGGER all ---禁用生产计划明细表上的触发器
------------------------以下开始进行编码转换操作------------
INSERT into 编码转换(物品编码,状态) SELECT 物品编码,'DEL' AS 状态 FROM deleted
INSERT into 编码转换(物品编码,状态) SELECT 物品编码,'INS' AS 状态 FROM inserted
update 投产安排 set 替代物料=INS.物品编码 from 投产安排,
(select 物品编码 from 编码转换 where 状态='INS') AS INS
where 投产安排.替代物料 in (select 物品编码 from 编码转换 where 状态='DEL')
update BOM set 子件编码=INS.物品编码 from BOM,
(select 物品编码 from 编码转换 where 状态='INS') AS INS
where BOM.子件编码 in (select 物品编码 from 编码转换 where 状态='DEL')
update BOM set 父件编码=INS.物品编码 from BOM,
(select 物品编码 from 编码转换 where 状态='INS') AS INS
where BOM.父件编码 in (select 物品编码 from 编码转换 where 状态='DEL')
update 车间领料明细 set DFS02=INS.物品编码 from 车间领料明细,
(select 物品编码 from 编码转换 where 状态='INS') AS INS
where 车间领料明细.DFS02 in (select 物品编码 from 编码转换 where 状态='DEL')
---------------------编码转换操作完毕----------------
ALTER TABLE BOM ENABLE TRIGGER all ----重新启用BOM表上的触发器
ALTER TABLE 生产计划明细 ENABLE TRIGGER all ----重新启用生产计划明细表上的触发器
delete from 编码转换---删除临时数据
end
我的方法是先禁用BOM和生产计划明细中的触发器,再做编码修改。然后重新启用BOM和生产计划明细中的触发器。
如果正常一条一条执行的话,应该是行得通的。但实际测试时,发现没达到预期效果。投产安排的重新生成的现象发生。也就是说,编码转换还没执行完时,禁用的触发器就被重新启用,然后调用存储过程去生成投产安排。
急。。。求解。本人只有80分了 T_T。。。哪位大侠解决了。全送。。
展开