触发器偶然出个bug

触发器偶尔出个bug
本帖最后由 jxllove 于 2015-02-09 14:39:55 编辑
各位大神过年好,想问个关于触发器的问题,一个插入时候的触发器,插入时候更新几列数据,但是有时候有一列未出现更新,不知道什么原因,想请教下:

-- =============================================
-- Description: 插入时候更新该条数据
-- =============================================
CREATE TRIGGER [dbo].[TriInertGroupAndPid]
   ON  [dbo].[VISITS]
   after INSERT 
AS 
BEGIN
DECLARE @id NUMERIC(30,0), @userid NUMERIC(10,0),@groupid NUMERIC(10,0),@puserid NUMERIC(10,0),@personid NUMERIC(10,0);
SELECT @id=ID,@userid=USER_ID FROM INSERTED;

SELECT @groupid=GROUP_ID FROM dbo.USERS WHERE ID=@userid;
IF( @groupid=92)
BEGIN
SELECT @puserid=ISNULL((SELECT ID FROM dbo.USERS WHERE PERSON_ID=p.MANAGER_ID),0) FROM dbo.USERS AS u INNER JOIN dbo.PERSONS p
ON u.PERSON_ID=p.ID 
WHERE u.ID=@userid AND u.GROUP_ID=92 AND p.DOMAIN_ID=26;

END
    IF (@puserid IS NOT NULL)
BEGIN
    SELECT @personid=PERSON_ID FROM dbo.USERS WHERE ID=@puserid;
    UPDATE v SET U_GROUP_ID= 90,USER_ID=@puserid,person_id=@personid,P_USER_ID=i.USER_ID FROM dbo.VISITS v,INSERTED i WHERE v.ID=i.ID AND v.CUSTOMER_ID=i.CUSTOMER_ID
    
END
    ELSE
BEGIN
     UPDATE v SET U_GROUP_ID= @groupid FROM dbo.VISITS v,INSERTED i WHERE v.ID=i.ID AND v.USER_ID=i.USER_ID
    
END
END

以上是触发器代码,目前也确定是执行的if里边的update,但是奇怪的是 USER_ID 列没有进行更新,这是实际环境中出现的数据,我个人一直测试不出来。
触发器偶然出个bug
截图是就是 有些数据执行了触发器的update,但是只更新了一部分列。
请大神赐教。新年快乐




------解决思路----------------------
INSERTED 里面可能会有多条记录的,你只响应了第一条。
------解决思路----------------------
加事務處理就可以了.

沒有用事務,完全可能同時讀取數據.
------解决思路----------------------
沒有用事務,完全可能讀取到相同的數據. 
------解决思路----------------------
修正前:你用一条INSERTED记录的逻辑,更新了全部INSERTED对应的记录。怎么会不错。

#2:VISITS的ID不唯一吗?更新条件只要 v.ID = @id 就够了吧。
还有INSERTED是已经插入了VISITS的数据,后一句UPDATE再原样更新VISITS多此一举。
游标循环中@puserid没有清空,@groupid <> 92 的情况下是等同于上一条的数据。