2011-10-25 152 views
1

我正在使用SQL Server 2005的触发器。我有更新后的表的触发器。声明变量后,代码就是这样。插入问题后的SQl触发器

if @isconfirmed_before = 0 and @isconfirmed_after = 1 
begin 

if @invite_userid <> '' 
     begin 

      select @points = points from dbo.InvitePoint where code = 'USR' and packageid = @packageid 
      INSERT INTO InviteCount 
        ([userID] 
        ,[joinMerchantID] 
        ,[packageID] 
        ,[points] 
        ,[joinDate]) 
      VALUES 
        (@invite_userid 
        ,@merchantid 
        ,@packageid 
        ,@points 
        ,getdate()) 
     end 

SET @alpha_numeric='' 
     SELECT @[email protected]_numeric+CHAR(n) FROM 
     (
      SELECT TOP 8 number AS n FROM master..spt_values 
      WHERE TYPE='p' and (number between 48 and 57 or number between 65 and 90) 
      ORDER BY NEWID() 
     ) AS t 

     update merchant 
     set reg_code = @alpha_numeric 
     where merchantid = @merchantid 

END 

update merchant 
    set reg_code = @alpha_numeric 
    where merchantid = @merchantid 

最后一部分是插入的行变却故每有更新表的时候这reg_code shoule只能一次插入。我如何做到这一点。请帮助我,提前谢谢!

+0

给出触发器的完整代码 –

回答

0
update merchant 
set reg_code = @alpha_numeric 
where merchantid = @merchantid 

每次有更新时都会执行该代码,因为您没有有条件的流程来阻止它有时执行。如果您只想执行给定条件,则需要将其包装在IF块中。

你说:“这个reg_code只在插入行时插入一次,但每次更新表时它都会改变。”那么为什么在AFTER UPDATE触发器呢?它看起来应该在AFTER INSERT触发器中。除非我误解你。

+0

触发器中有很多其他语句,应在每次更新后运行。所以我为插入后创建了一个新的触发器。它运行良好。感谢您的领导:) – Ram

+0

@Ram乐于帮助! :) – 2011-10-25 14:10:26

0

好吧,你非常麻烦触发器。首先你需要显示实际的创建触发代码。我怀疑你没有正确设置只在插入时触发。

接下来,您需要假设触发器必须能够处理多个记录插入。无论何时,当你在触发器中为标量变量设置一个值时,你可能做错了什么。这不可能是你的全部触发器,因为你没有展示你如何得到可变值。