UPDATE多行数据时为什么只能激发一次触发器?
我在一个表中设了一个触发器,此表中有一字段为TAG,我设为BIT型,作为标志,
触发器的作用就是当数据的TAG为1时执行,可时我用UPDATE将多行数据的TAG更新为1时,只有最后一行数据的触发器被激活了,这可如何是好?
问题点数:20、回复次数:11Top
1 楼aflyingpig(毛毛)回复于 2003-11-02 22:57:36 得分 0
把你的代码贴出来看看
是不是你的触发器用了变量Top
2 楼txlicenhe(马可)回复于 2003-11-03 08:14:45 得分 0
应该是你的触发器的代码有问题。Top
3 楼pengdali()回复于 2003-11-03 08:35:21 得分 0
举例多记录操作语句:(楼主看看update是怎么写的)
CREATE TRIGGER 名1 ON dbo.tabMain
FOR INSERT
AS
insert db2..tabSlave select * from inserted
go
CREATE TRIGGER 名2 ON dbo.tabMain
FOR update
AS
update db2..tabSlave set 列=aa.列 from inserted aa where aa.编号=db2..tabSlave.编号
go
CREATE TRIGGER 名3 ON dbo.tabMain
FOR delete
AS
delete db2..tabSlave where 编号 in (select 编号 from deleted)
Top
4 楼zjcxc(邹建)回复于 2003-11-03 08:58:58 得分 5
SQL中的触发器是这样的,不支持行级触发.
即: 一个更新语句如果影响到多个行时,只产生一次触发.
所以你在触发器的代码中就要考虑,更新产生的触发可能是多条记录,对就的处理语句也应该做这方面的处理.
Top
5 楼zjcxc(邹建)回复于 2003-11-03 08:59:35 得分 0
检查你的触发器代码,看有没有做这方面的考虑.如果不知道怎么做?贴出你的处理代码Top
6 楼tlfangqing(东北大刀)回复于 2003-11-03 19:52:17 得分 0
我编的是进销存系统.有一项功能为入库单审核,有入库单表和入库单商品明细表.当用户审核后,入库单表中的RITAG和明细表中的RITAG都是表示,当RITAG=1是表示此入库单或商品入库.
我设了两个触发器,一个是入库单表的,一个是明细表的.其中RIENO为入库单号.为RCIN表的主键,RCINB表的外键.
这是RCIN表中的触发器.
CREATE TRIGGER RCIN_INSERT ON dbo.RCIN
FOR INSERTED,UPDATE
AS
DECLARE @RITAG BIT
SELECT @RITAG=RITAG FROM INSERTED
IF @RITAG=1
UPDATE RCINB
SET RITAG=1
WHERE RIENO=(SELECT RIENO FROM INSERTED)
这是RCINB(入库单细表)表中的触发器.
CREATE TRIGGER RCINB_INSERT ON dbo.RCINB
FOR INSERTED,UPDATE
AS
DECLARE @RITAG BIT
SELECT @RITAG=RITAG FROM INSERTED
IF @RITAG=1 .....(执行入库操作,如使商品库存量增加等)
由于刚入库时RITAG=0,所以审核时更新为1时,每个入库单所对应的商品中只有最后一个能入库,即只执行了一次触发器,真时急死我了.大家快救我.
Top
7 楼pengdali()回复于 2003-11-03 19:54:56 得分 0
CREATE TRIGGER RCIN_INSERT ON dbo.RCIN
FOR INSERT,UPDATE
AS
UPDATE RCINB
SET RITAG=1
WHERE RIENO in (SELECT RIENO FROM INSERTED where RITAG=1)Top
8 楼pengdali()回复于 2003-11-03 19:55:29 得分 0
你都改为这样。Top
9 楼tlfangqing(东北大刀)回复于 2003-11-03 20:24:22 得分 0
还是没能实现.此改后,RCINB表中对应的RITAG是全变成了1,可是只有最后一个入库商品执行了触发器,入了库,不知为何.Top
10 楼cadinfo(无语清风)回复于 2003-11-04 12:09:20 得分 15
这个问题我在近期发现,已经成功解决,原因是在你这样更新多条记录的时候,inserted表中存在多条记录,这样我是采用游标进行遍历,然后进行逐行处理。
我的问题是存在于delete触发器,如果采用delete from table1时候,希望用触发器删除所有相关信息,同样的问题是只删除一条,现在用游标解决了,示例代码如下,希望对你有启发:
--drop trigger trg_delete_crjlb
create trigger trg_delete_crjlb on crjlb with encryption for delete as
declare @cpbs char(3),@crbh char(2)
declare del_cursor cursor for select cpbs,crbh from deleted --看看能否管用
open del_cursor
fetch del_cursor into @cpbs,@crbh
while @@fetch_status=0
begin
exec('drop table B'+@cpbs+@crbh)
fetch del_cursor into @cpbs,@crbh
end
close del_cursor
deallocate del_cursor
go
---------------------------------
你可以将我的代码修改,这仅仅是个思路,祝你顺利Top
11 楼tlfangqing(东北大刀)回复于 2003-11-04 20:43:06 得分 0
我用游标写成了这样,可还是不行,在RCIN表中更改后RCINB表的数据居然没反应,不知为何.
用游标怎样进行定位更新呢?就是说,我遍历到哪一行,就对那一行的RITAG字段进行更新,该怎么写呢???
CREATE TRIGGER [NEWRCIN_INSERTED] ON [dbo].[RCIN]
FOR INSERT
AS
DECLARE @RITAG BIT,@RIENO NUMERIC
SELECT @RITAG=RITAG FROM INSERTED
IF @RITAG=1
BEGIN
DECLARE UPDATE_CURSOR CURSOR FOR SELECT RIENO FROM RCINB WHERE RIENO=(SELECT RIENO FROM INSERTED)
OPEN UPDATE_CURSOR
FETCH NEXT FROM UPDATE_CURSOR
WHILE @@fetch_status=0
BEGIN
UPDATE RCINB
SET RITAG=1 WHERE CURRENT OF UPDATE_CURSOR
FETCH NEXT FROM UPDATE_CURSOR
END
CLOSE UPDATE_CURSOR
DEALLOCATE UPDATE_CURSOR
END
Top




