触发器生效的问题

sbks 2006-12-28 10:25:45
在表A上的触发器代码不生效,一跟踪,发现同一个事务对表A进行了这样一个过程:insert,delete,insert

表A上的insert触发器会被触发几次?每次触发时inserted缓冲区能看到的记录是本次事务的记录还是本次触发的记录?

郁闷啊:(
...全文
312 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rookie_one 2007-01-25
  • 打赏
  • 举报
回复
希望没晚
funsuzhou 2007-01-25
  • 打赏
  • 举报
回复
接分!
y_dong119 2007-01-25
  • 打赏
  • 举报
回复
我也接塞
zsl5305256 2007-01-25
  • 打赏
  • 举报
回复
ALTER trigger tri_rd_ins on rdrecord
for insert,update
as

declare @rc int,@flownow int,@rdid int
declare @bmbm varchar(30),@wzlb varchar(20),@rq varchar(6),@no varchar(6)
declare @codepre varchar(255) --前缀

begin
select @rc=count(id) from inserted
insert aa_tmp values(convert(varchar(20),@rc))
--如果缓冲区内行数多于一行,则退出触发器
if @rc>1 return

--编号前缀
select @bmbm=case left(cdepcode,2) when '01' then 'NN' when '02' then 'LZ' when '03' then 'GL' when '04' then 'WZ' when '05' then 'YL' when '06' then 'BS' when '07' then 'QZ' when '08' then 'HC' when '09' then 'BH' when '10' then 'GX' else 'XX' end from inserted
select @wzlb='GC' --目前先处理工程
select @rdid=id,@rq=right(convert(varchar(6),ddate,112),4) from inserted
select @codepre=@bmbm+'-'+@wzlb+@rq

insert aa_tmp values(convert(varchar(20),@rdid))
insert aa_tmp values(convert(varchar(20),@codepre))

--取流水号
--算法:以已有的流水号+1,再对照已有的流水号,如果not in的话,则说明该流水号可用
select @flownow=min(b.nextno) from
rdrecord a inner join
(select id as 'id',(convert(int,(right(ccode,4))) + 1) as 'nextno' from rdrecord where left(ccode,9)=@codepre and bisstqc=0) b on a.id=b.id
where b.nextno not in (select convert(int,(right(ccode,4))) from rdrecord where left(ccode,9)=@codepre and bisstqc=0)

--流水不存在则初始化为1
if @flownow is null set @flownow=1
insert aa_tmp values(convert(varchar(20),@flownow))

--将流水转换成字符
set @no = convert(varchar(6),@flownow)
set @no = case when @flownow<10 then '000'+@no when @flownow<100 then '00'+@no when @flownow<1000 then '0'+@no else @no end
insert aa_tmp values(convert(varchar(20),@no))

--更新单据编号
update rdrecord set ccode=@codepre+@no where id=@rdid

end
zsl5305256 2007-01-25
  • 打赏
  • 举报
回复
我也来!
sbks 2006-12-28
  • 打赏
  • 举报
回复
自己搞定了,放分,见者有份:)

后面的delete,insert其实是程序发出一条update语句,我把触发器挂update上就OK了。
中国风 2006-12-28
  • 打赏
  • 举报
回复
用instead of insert 类型的触发器可解决并发
中国风 2006-12-28
  • 打赏
  • 举报
回复
楼上用变量调用,如果插入记录大于1条。会出现这样的问题
caixia615 2006-12-28
  • 打赏
  • 举报
回复
ALTER--->create trigger tri_rd_ins on rdrecord
缓冲区看到的应该是本次事务记录...
sbks 2006-12-28
  • 打赏
  • 举报
回复
ALTER trigger tri_rd_ins on rdrecord
for insert
as

declare @rc int,@flownow int,@rdid int
declare @bmbm varchar(30),@wzlb varchar(20),@rq varchar(6),@no varchar(6)
declare @codepre varchar(255) --前缀

begin
select @rc=count(id) from inserted
insert aa_tmp values(convert(varchar(20),@rc))
--如果缓冲区内行数多于一行,则退出触发器
if @rc>1 return

--编号前缀
select @bmbm=case left(cdepcode,2) when '01' then 'NN' when '02' then 'LZ' when '03' then 'GL' when '04' then 'WZ' when '05' then 'YL' when '06' then 'BS' when '07' then 'QZ' when '08' then 'HC' when '09' then 'BH' when '10' then 'GX' else 'XX' end from inserted
select @wzlb='GC' --目前先处理工程
select @rdid=id,@rq=right(convert(varchar(6),ddate,112),4) from inserted
select @codepre=@bmbm+'-'+@wzlb+@rq

insert aa_tmp values(convert(varchar(20),@rdid))
insert aa_tmp values(convert(varchar(20),@codepre))

--取流水号
--算法:以已有的流水号+1,再对照已有的流水号,如果not in的话,则说明该流水号可用
select @flownow=min(b.nextno) from
rdrecord a inner join
(select id as 'id',(convert(int,(right(ccode,4))) + 1) as 'nextno' from rdrecord where left(ccode,9)=@codepre and bisstqc=0) b on a.id=b.id
where b.nextno not in (select convert(int,(right(ccode,4))) from rdrecord where left(ccode,9)=@codepre and bisstqc=0)

--流水不存在则初始化为1
if @flownow is null set @flownow=1
insert aa_tmp values(convert(varchar(20),@flownow))

--将流水转换成字符
set @no = convert(varchar(6),@flownow)
set @no = case when @flownow<10 then '000'+@no when @flownow<100 then '00'+@no when @flownow<1000 then '0'+@no else @no end
insert aa_tmp values(convert(varchar(20),@no))

--更新单据编号
update rdrecord set ccode=@codepre+@no where id=@rdid

end
caixia615 2006-12-28
  • 打赏
  • 举报
回复
贴你的代码出来吧~

34,588

社区成员

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

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