可以在一个触发器中有两个游标吗?

salut 2007-10-13 09:40:52
当我触发一个触发器,在这个触发器中有两个游标:

----------------------------------------------------------------------------------------------
--每当系统日期表nowTime更新一次就对表中所有需要更新的数据更新一次
create trigger 刷新触发器 on nowTime
for insert
as
begin
--------------------------------------------------------------------------------游标_reader
--读者表,如果卡的失效时间cardBlankOutTime时间超过系统时间的话将违约状态置为1
--创建一个游标,进行逐行对是否过期给出明确判断,然后修改errState的值
declare 游标_reader cursor for
select rNo,cardBlankOutTime,errState
from reader

open 游标_reader
begin
declare @cRno char(8),@cCardBlankOutTime datetime,@cErrState bit,@sysTime datetime
select @sysTime=now from nowTime
fetch 游标_reader into @cRno,@cCardBlankOutTime,@cErrState
while (@@fetch_status=0)
begin
if((@cCardBlankOutTime-@sysTime)<0 and @cErrState<>1)
update reader set errState=1
where current of 游标_reader
else if((@cCardBlankOutTime-@sysTime)>=0 and @cErrState<>0)
update reader set errState=0
where current of 游标_reader
fetch 游标_reader into @cRno,@cCardBlankOutTime,@cErrState
end
end
commit tran
close 游标_reader
deallocate 游标_reader

-------------------------------------------------------------------------------------------游标_RL
--读者借阅表信息更新,如果还书时间过期了,则把读者的违约状态errState改为1,禁止借书和续借,
--并自动把违约信息输入读者违约表
print'判断借阅表借阅图书是否超期' --记号
declare 游标_RL cursor for
select rNO,bNo,giveBackTime
from RL

open 游标_RL
begin
declare @RL_Rno char(8),@cBno int,@cGiveBackTime datetime,@RL_SysTime datetime
select @sysTime=now from nowTime
fetch 游标_RL into @RL_Rno,@cBno,@cGiveBackTime
while(@@fetch_status=0)
begin
if((@RL_SysTime-@cGiveBackTime)>0 and (select errState from reader where rNo=@RL_Rno)<>1)
begin
--把违约状态改为1
update reader set errState=1
where current of 游标_RL
--把违约信息插入违约表
insert into RR(rNo,bNo,ruleNo,breakRuleTime)
values(@RL_Rno,1,@cBno,@RL_SysTime)
--where current of 游标_RL
end
fetch 游标_RL into @cRno,@cBno,@cGiveBackTime
end
end
commit tran
close 游标_RL
deallocate 游标_RL
-----------------------------------------------------------------------------------------------
end
go


但是运行时除了问题:
(所影响的行数为 1 行)

判断借阅表借阅图书是否超期
服务器: 消息 3902,级别 16,状态 1,过程 刷新触发器,行 60
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
语句已终止。

是不是一个触发器中不能有两个游标?还是我的哪里出了问题?


还有一个问题:对于一个事件,假如往一个表中插入数据之后,能不能有建两个或更多个触发器?如果可以执行顺序怎么样?

...全文
240 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
salut 2007-10-16
  • 打赏
  • 举报
回复
哎呀,辛苦你们了,看懂都不容易!
Limpire 2007-10-13
  • 打赏
  • 举报
回复
-- 更新reader表
declare @sysTime datetime
select @sysTime=now from INSERTED
update reader set errState=1 where cardBlankOutTime<@sysTime and errState<>1
update reader set errState=0 where cardBlankOutTime>=@sysTime and errState<>0

/*
第二个游标部分,@RL_SysTime没有赋值,本人不知道什么逻辑,所以没法改写。
*/
Limpire 2007-10-13
  • 打赏
  • 举报
回复
这么简单的业务规则,两条SQL就可以解决,不需要2个游标——1个都不要。
Limpire 2007-10-13
  • 打赏
  • 举报
回复
没有标记显式事务的开始——BEGIN TRANSACTION,怎么能COMMIT TRANSACTION。

隐式事务不需要COMMIT,系统自己会COMMIT或ROLLBACK。
panjinfu80 2007-10-13
  • 打赏
  • 举报
回复
这样会很慢的,想别的办法吧。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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