一个关于SQL SERVER7.0的使用问题(100分)

  • 主题发起人 主题发起人 thefool
  • 开始时间 开始时间
T

thefool

Unregistered / Unconfirmed
GUEST, unregistred user!
前台,我在delphi5中,用Tdbgrid对sql server7.0中的表进行修改。

后台,在修改触发器中想撤消对表中个别记录的修改,我该如何编写更新触发器?

比如:
create trigger tes_onupdate on tes for update as
declare curtes cursor for select * from deleted d inner join inserted i
on d.tesid=i.tesid
open curtes
fetch next from curtes
while @@fetch_status=0 begin
save tran savtran --在这保存不行吧?
....

if (...) begin
...
rollback savtran ---在这恢复事务看来也很无聊,到底该怎么办?
end
fetch next from curtes
end
close curtes
deallocate curtes
return
 
trigger在一开始执行的时候会自动进入事物处理模式,即你只须在适当的时候调用rollback;
问题是要看你的if(...)语句是否可以控制住,如果可以,完全没必要rollback;
如果不确定,我觉得可以在适当的时候用break从while语句中跳出,然后再视情况rollback(比如加一个变量控制)。
 
>trigger在一开始执行的时候会自动进入事物处理模式,即你只须在适当的时候调用rollback
确实是这样的,例如
SELECT @error = @@error
if @error <> 0
begin
raiserror('update t_test_table error', 16,1)
rollback tran
return
end
 
我不是这个意思,也许还是思路不清吧,所以没说明白:拿一道题目来说吧:
某企业为了提高效益,每个月总要跟据盈利情况,拔出一定的金额作为奖金发放给一批工作
努力的工人(比如发4215元),其发放方法如下:
1。跟据工人超计划生产产品的数量由大到小排名
2。按排名顺序跟据超计划生产产品的数量补发奖金(比如:每多生产一种产品,补发20元)
3。直到剩余奖金不足发放时,停止发放。
这只是个例子,我们不考虑超计划生产产品的数量相同时的排名。
我想编写出来一个触发器,以后我只需执行一句:
update tes set 奖金=计划外数量*20 where 月份=10
(当然,要有一个表记录每月的奖金总额)
它就应可以自动分配10月份每一个工人应得的奖金

如果,你能解决这个问题,就基本解决了我说的问题,总结一下,主要是说,inserted表
和deleted 相关联后表的行数不止一行,每一行在更新前,我不知该更新还是不该更新,
只有在循环处理后,才知道可不可以更新。但对不可以更新的数据,我要撤消对它的修改,
对可以更新的数据要保留更新值。

 
不知我理解清楚了沒﹐你提交多條的資料中﹐有某些值要取消﹐這樣寫觸發器似不好﹐
你可考慮的前端控制﹐比如在TDataset的OnValidate事件中
 
I'm listening!
 
多人接受答案了。
 
后退
顶部