表a结构为
create table a 
(
id int identity pramery key,
lxName varchar(50) not null,
costEvidence varchar(100)
)costEvidence为凭证号,现在此表存在一部分数据,
要求新插入或修改的表a数据时不可以与CostEvidence现有数据重复,
这样的触发器怎么写呢

解决方案 »

  1.   

    其实,你给这个字段:CostEvidence加上一个唯一性索引,比用触发器更方便。
      

  2.   

    答非所问你也支持?都说过了原先的CostEvidence数据不充许修改"触发器专家VS触发器难题"
      

  3.   

    呵呵回的时候没看到你的回复,
    CREATE TRIGGER TRI ON A FOR UPDATE,INSERTED
    AS 
      BEGIN
           IF EXISTS(SELECT 1 FROM A JOIN INSERTED I ON A.costEvidence=I.costEvidence )
             处理..
           ELSE
            处理..
    END
      

  4.   

    我就是这样写的ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
     for insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    end 
    消息 50000,级别 16,状态 1,过程 RegBusiness_I,第 8 行
    缴费凭证号已经存在
    消息 3609,级别 16,状态 1,第 1 行
    事务在触发器中结束。批处理已中止。
      

  5.   

    insert regBusiness (LxName,Mobile,costEvidence,verifyCase,fpcase) select '测试','abcdefg11','asdfsadf111',0,0asdfsadf111 在表中实际不存在 
      

  6.   

    “feixianxxx”呢,这老大比较活越,我的问题怎么给越过去了?
      

  7.   

    楼主你应该用instead of 触发器,在插入或UPDATE之前进行判断。
    你那个判断是事后的了,只要你一插入或UPDATE数据就会提示,甭管costEvidence已经存在。
    ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
    instead of insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    end 
     
      

  8.   

    ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
     for insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence 
    AND I.id<> R.ID   ---加个条件,别被自己绊倒自己
    ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    end 
      

  9.   

    用instead of 触发器更好,不过12楼有问题ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
    instead of insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    return
    end delete RegBusiness where id in (select id from deleted)
    insert RegBusiness(lxName,costEvidence) select lxName,costEvidence from inserted  
     
      

  10.   

    我觉得也没有问题呀,替代触发是插入前比较,不存在那条插入的数据,FOR的话有问题
      

  11.   

    13楼:表RegBusiness的id为自增的,不会存在你说的那种情况啊
      

  12.   


    ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
    instead of insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    end 这样写无论插入一条相同的CostEvidence或不同的都提示一条数据插入成功了,但实际上数据没有插入进去
      

  13.   

    instead of 触发器必须在触发器中写插入或者更新的语句自增怎么了?也可以在触发器判断,就是解决你抱错的问题,因为for或者after 触发器是执行后出发的,所以你每次都会报错消息 50000,级别 16,状态 1,过程 RegBusiness_I,第 8 行
    缴费凭证号已经存在
    消息 3609,级别 16,状态 1,第 1 行
    事务在触发器中结束。批处理已中止。
      

  14.   

    光考虑判断重复的了,把更改数据给漏了,用这个吧。
    ALTER trigger [RegBusiness_I] on [dbo].[RegBusiness]
    instead of insert,update
    as 
    if ( Exists( select * from inserted as i join [RegBusiness] as r on i.CostEvidence = r.costEvidence ) )
    begin
    raiserror('缴费凭证号已经存在',16,1)
    rollback transaction
    return
    end 
    delete RegBusiness where id in (select id from deleted)
    insert RegBusiness(lxName,costEvidence) select lxName,costEvidence from inserted