从未见过的SQL SERVER触发器问题,“死也想不明白”

tronrich 2009-04-19 03:44:52
各位高人:我的问题是这样的,我有二个表:A和B,在A表的触发器中需要写数据至B表中,B表也有二个触发器,在写入数据至B表之前要先判断B表中数据是否己存在,如存在则更新,不存在则插入,但就是这样一个判断的速度却慢得要死,我专门将此判断的SQL语句执行的时间放入一个临时表中,发现要近2W多毫秒,执行判断语句根本就没触发B表的触发器,应该不是受B表触发器的影响,但奇怪的是去掉B表二个触发器后,速度就正常了,真不知是何原因?难道查询有触发器的表速度会受影响吗?各路高人给予明示,不甚感激!
...全文
117 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tronrich 2009-04-19
  • 打赏
  • 举报
回复
呵呵!谢谢大家,问题终于解决了,唉!IT人没办法,心情跟着电脑转啊!
-狙击手- 2009-04-19
  • 打赏
  • 举报
回复
别“想死”呀,得做一个快乐的IT人嘛
JonasFeng 2009-04-19
  • 打赏
  • 举报
回复
代码显示肯定触发了B表的触发器。
所以你把B表的触发器去掉,速度就正常了。
  • 打赏
  • 举报
回复
事实上,你在A表的语句的执行触发了B表的触发器的执行。
看下你的结构就清楚了

if not exists(
begin
insert WorkReg-----可能触发B表的触发器

end
else
update ---也会触发B表的触发器

所以你的语句肯定是触发了B表的触发器
sdhdy 2009-04-19
  • 打赏
  • 举报
回复
虽然查询的时候不会触发B表的触发器,但是感觉和B表的触发器会有一定关系。
sdhdy 2009-04-19
  • 打赏
  • 举报
回复
是SQL 2000还是更高的版本?B表有多少条记录?
appleller 2009-04-19
  • 打赏
  • 举报
回复
你这三个触发器好像可以合并成一个吧,直接在A表中触发判断应该可以吧。
触发器太多了比较烦的
tronrich 2009-04-19
  • 打赏
  • 举报
回复
set @BDate=getdate()
--下面这句速度很慢,但去掉WorkReg表的触发器则正常
if not exists(select iId from WorkReg where PlanId=@PlanId and tiId=@tiId and
StepId=@StepId and StationId=@Station1 and iEmplId=@iEmp1 and
StationGp=@StationGp1 and RegDate=@Date1 and TmpStepAssId=@TmpStepAssId)
begin
set @EDate=getdate()
insert into aCost(StepNo,begindate,enddate,costm) values (5,@BDate,@EDate,datediff(ms,@BDate,@EDate))
set @BDate=@EDate
--插入数据至WorkReg表
select @iId=IsNull(max(iId)+1,1) from WorkReg
insert into WorkReg(iId, PlanId, tiId, OrganId, ProdId, StepId, StationId,
StationGp,iEmplId, Num, RegDate,PlanProdId,EmpId,
WorkPrice,QuoPercent,AllQuoPercent,WorkTime,TmpStepAssId,IsTempTask,
StepName,TechOrderId,StationName,SemiName,WorkNum,
PlanNo,OrganCode,SalaKind,IsReversePoint,cEmpCode,cEmplN,
SpecCode,DetailCode,ProdCode,ProdName,Factor,AlreadyReverse)
values(@iId,@PlanId,@tiId,@OrganId,@ProdId,@StepId,@Station1,@StationGp1,
@iEmp1,@Num1,@Date1,@PlanProdId,@IID1,@WorkPrice,@QuoPercent1,@AQuoPcent1,
@WorkTime,@TmpStepAssId,@IsTempTask,@StepName,@TechOrderId,@StationN1,@SemiName,@WorkNum,
@PlanNo,@OrganCode,@SalaKind,@IsReversePoint,@cEmpCode1,@cEmplN1,@SpecCode,
@DetailCode,@ProdCode,@DetailName,@Factor,@AlreadyReverse)
end
else
update WorkReg set Num=@Num1,QuoPercent=@QuoPercent1,AllQuoPercent=@AQuoPcent1,Factor=@Factor
where PlanId=@PlanId and tiId=@tiId and
StepId=@StepId and StationId=@Station1 and iEmplId=@iEmp1 and
StationGp=@StationGp1 and RegDate=@Date1 and TmpStepAssId=@TmpStepAssId
tronrich 2009-04-19
  • 打赏
  • 举报
回复
楼上的能否说明白些,可以更新数据,只是慢而己,并且是在做判断查询而非写入数据的时候就花费了很长的时间
mxzy55560593 2009-04-19
  • 打赏
  • 举报
回复
饿 我1L把意思都理解错了
呜呜
B表有两个触发器,insert update delete中两个,那你插入和跟新操作肯定会触发其中一个啊~~
mxzy55560593 2009-04-19
  • 打赏
  • 举报
回复
要更新数据,用户必须同时具有update权限和select权限

我觉得应该是这个原因~~

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧