+ -
当前位置:首页 → 问答吧 → ms SQL2000中,问一个事务与触发器的问题.急....

ms SQL2000中,问一个事务与触发器的问题.急....

时间:2011-12-21

来源:互联网

HTML code

proadd.asp的主要代码如下:

on error resume next
conn.BeginTrans

for i =1 to 10
    pid=request.form("proid"&i)
    num=request.form("num"&i)
    sql="insert into prolist(pid,account) values('"&pid&"','"&num&"')"
    conn.execute(sql)
end if

if conn.Errors.Count=0 then
    conn.CommitTrans
    response.write "成功更新。"
else
    conn.RollbackTrans
    call alert("执行操作时出错,请重新尝试!")
end if

-------------------------------------------------
ms sql2000中,表prolist的字段如下:用于记得每次进仓,出仓的明细记录的:
id    pid(即是产品ID号)    account

--------------------------------------------------
库存表proall的字段如下:
pid   allaccount

--------------------------------------------------
我想要个触发器,实现每次向表prolist插入数据时,将通过prolist的触发器将数量account累加到proall表中。

如果程序文件proadd.asp不是用事务的话,触发器大伙都知怎么编写的,就如下:
CREATE TRIGGER [prolist_add] ON dbo.prolist 
FOR INSERT 
AS
begin
    declare @pid numeric(10)
    declare @account numeric(10)
    select @pid=pid,@account=account from inserted
    update proall set allaccount=allaccount + @account where pid=@pid
end

我想问的是,程序文件proadd.asp用了事务的话,上面这个触发器就只会最后一次insert记录进行更新,
而前面的是没有更新表proall的allaccount的,
那请问,这个触发器怎么写呢?在线等。。。。。。。

作者: rings2000   发布时间: 2011-12-21

用不用事务有什么区别吗?

作者: fredrickhu   发布时间: 2011-12-21

程序文件proadd.asp用了事务的话,上面这个触发器就只会最后一次insert记录进行更新,
而前面的是没有更新表proall的allaccount的

作者: rings2000   发布时间: 2011-12-21

我是一次提交10条记录的,如果用了事务,执行conn.CommitTrans后,只会对第10次的insert记录进行触发,将数量更新到proall表中,而前面9次的没有更新的.

作者: rings2000   发布时间: 2011-12-21

这个算不算事务嵌套
insert语句其实是开启了一个隐性事务,而触发器和insert都属于这个事务里的吧

作者: pengxuan   发布时间: 2011-12-21

我的程序文件是这样的:
proadd.asp的主要代码如下:

on error resume next
conn.BeginTrans

for i =1 to 10
  pid=request.form("proid"&i)
  num=request.form("num"&i)
  sql="insert into prolist(pid,account) values('"&pid&"','"&num&"')"
  conn.execute(sql)
end if

if conn.Errors.Count=0 then
  conn.CommitTrans
  response.write "成功更新。"
else
  conn.RollbackTrans
  call alert("执行操作时出错,请重新尝试!")
end if

如果我程序代码为以下的,是没有问题的:
proadd.asp的主要代码如下:
for i =1 to 10
  pid=request.form("proid"&i)
  num=request.form("num"&i)
  sql="insert into prolist(pid,account) values('"&pid&"','"&num&"')"
  conn.execute(sql)
end if
但是这样的代码,有可能会造成提交的数据保存不完整,有可能只是插入了前面几条数据的,所以用事务conn.BeginTrans ,conn.CommitTrans
的.这样要么全部保存10条,要么,就一条也保存不了的.提示"执行操作时出错,请重新尝试".

作者: rings2000   发布时间: 2011-12-21

我是想用ASP事务的机制,批量插入数据的。

作者: rings2000   发布时间: 2011-12-21

CREATE TRIGGER [prolist_add] ON dbo.prolist  
FOR INSERT  
AS
begin
  update proall set allaccount=allaccount + inserted.account from proall,inserted where proall.pid=inserted.pid
end
上面这个UPDATE,语法对吗?可以from proall,inserted 的吗?

作者: rings2000   发布时间: 2011-12-21