MS SQL里,多条SQL语句是按顺序一一条的执行吗?

查询分析器里好像是按顺序一条一条的执行,但在数据库内部呢?我用的生产系统有一个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。。。哪位大侠解决了。全送。。
展开
 我来答
关中布衣
2011-11-02 · 超过47用户采纳过TA的回答
知道小有建树答主
回答量:371
采纳率:0%
帮助的人:116万
展开全部
sql是顺序执行的,你没考虑并发影响吧,举个例子:
A 用户触发 物料档案 的trigger
执行到 update BOM 时 刚好B用户也触发 物料档案 的trigger 而且执行完了
也就是说这是 BOM上的trigger是可用的
所以会出现你说的情况。
追问
谢谢你的提醒,这个情况的确是没有考虑到。
但在我的测试环境里,只有我一个用户在使用。所以不会存在并发影响的情况。
追答
我说用户只是一个例子 其实一个用户操作连续对[物料档案]这个表更新(尤其是用程序批量更新) 也会出现上述问题
百度网友d3ba069
2011-11-02 · TA获得超过789个赞
知道小有建树答主
回答量:294
采纳率:50%
帮助的人:110万
展开全部
begin tran
insert into....
update ....
commit tran
追问
我对SQL的触发器和存储过程不是很熟悉。。。F56_2000  能否说得详细些?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
隔壁有骑士
2011-11-07 · 超过22用户采纳过TA的回答
知道答主
回答量:142
采纳率:0%
帮助的人:73.3万
展开全部
加个序列试试?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式