CREATE TRIGGER st_sp_UPDATE ON dbo.st_sp FOR UPDATE AS if @@rowcount>0 begin declare @qty float declare @per float declare @spcode varchar(10) declare @detcode varchar(10) declare @sp bit select @spcode=sp_Code,@detcode=det_code from deleted select @sp=sp from st_prd_mstk where prd_code=@spcode if @sp<>(1) begin raiserror('此成品不是促销品,不能保存!',16,1) return end select @qty=qty from st_sp where (sp_code=@spcode) and ((qty is null) or (qty=0)) if @@rowcount>0 begin raiserror('各单品的数量不能小于1,请重新设定各单品数量!',16,1) return end select @per=sum(per) from st_sp where (sp_code=@spcode) if @per<>100 begin raiserror('各单品所占促销品百分比的总和不等于100,请重新设定各单品所占促销品的百分比率!',16,1) return end end 请问,我这个触发器这样写有何错误?
FOR UPDATE
AS
if @@rowcount>0
begin
declare @qty float
declare @per float
declare @spcode varchar(10)
declare @detcode varchar(10)
declare @sp bit
select @spcode=sp_Code,@detcode=det_code from deleted
select @sp=sp from st_prd_mstk where prd_code=@spcode
if @sp<>(1)
begin
raiserror('此成品不是促销品,不能保存!',16,1)
return
end
select @qty=qty from st_sp where (sp_code=@spcode) and ((qty is null) or (qty=0))
if @@rowcount>0
begin
raiserror('各单品的数量不能小于1,请重新设定各单品数量!',16,1)
return
end
select @per=sum(per) from st_sp where (sp_code=@spcode)
if @per<>100
begin
raiserror('各单品所占促销品百分比的总和不等于100,请重新设定各单品所占促销品的百分比率!',16,1)
return
end
end
请问,我这个触发器这样写有何错误?
问题关键是在数据表中出现重复记录
当Delphi6.0刚刚推出来的时候,很多宣传资料说解决了这个问题,但是在最残酷的测试下,依然出现此问题!
最容易出现的地方是:当新增记录的时候,表里面添加了默认值,然后保存。因为Delphi默认不添加空的重复记录(当年FoxPro程序员转Delphi的时候被这个限制搞的头晕脑胀),但是只要有值就可以添加(大量出现在主从关系的从表中,关联字段默认添加),然后就死掉了!所以你的触发器有点是在“FOR UPDATE”上,只有更新时触发,那么INSERT时如何处理,其实这个问题最容易出现在这里!据我的使用及测试经验,一般解决方案有如下几点:
1、及时升级你的MDAC(目前是2.7 Refresh 2)及开发工具补丁,通过ADO方式连接数据库这是没有办法的办法,当然不会很彻底;
2、给数据库建立唯一索引,这种方法根据实际情况而定,因为很多情况下必须要添加自动递增字段,象有些基础资料数据库根本就不可取
3、比较好的办法,全部用手工控制不出现重复记录一般情况下,控制方法主要有:
1、尽量不使用DB控件,尤其是DBNavigate控件,通过ADO的时候那玩意实在太弱智;
2、多数数据控制可以通过键值控制或者通过触发器控制!
另外呢,我想各位兄弟还是没有看到我写的.在写这贴之前我搜索了以前所有有关这类问题的旧贴子,并按别人的解答方式认真的检查过:试过取消唯一索引,试过adodataset.refresh和adodataset.close
adodataset.open.
都没有用.我认真检查过表中,没有重复的记录.我采用的是使用事务提交方式.
但是问题总是存在.
不得已才重新把这问题发贴出来.在这我说明下:
1. 在我的表中绝对不存在重复的记录.
2.我在表中已建了唯一索引.
所以我在这只好还向各位高手问一句.是不是我的上面的触发器写错了?