触发器偶然出个bug
触发器偶尔出个bug
各位大神过年好,想问个关于触发器的问题,一个插入时候的触发器,插入时候更新几列数据,但是有时候有一列未出现更新,不知道什么原因,想请教下:
以上是触发器代码,目前也确定是执行的if里边的update,但是奇怪的是 USER_ID 列没有进行更新,这是实际环境中出现的数据,我个人一直测试不出来。

截图是就是 有些数据执行了触发器的update,但是只更新了一部分列。
请大神赐教。新年快乐
------解决思路----------------------
INSERTED 里面可能会有多条记录的,你只响应了第一条。
------解决思路----------------------
加事務處理就可以了.
沒有用事務,完全可能同時讀取數據.
------解决思路----------------------
沒有用事務,完全可能讀取到相同的數據.
------解决思路----------------------
修正前:你用一条INSERTED记录的逻辑,更新了全部INSERTED对应的记录。怎么会不错。
#2:VISITS的ID不唯一吗?更新条件只要 v.ID = @id 就够了吧。
还有INSERTED是已经插入了VISITS的数据,后一句UPDATE再原样更新VISITS多此一举。
游标循环中@puserid没有清空,@groupid <> 92 的情况下是等同于上一条的数据。
各位大神过年好,想问个关于触发器的问题,一个插入时候的触发器,插入时候更新几列数据,但是有时候有一列未出现更新,不知道什么原因,想请教下:
-- =============================================
-- 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 列没有进行更新,这是实际环境中出现的数据,我个人一直测试不出来。
截图是就是 有些数据执行了触发器的update,但是只更新了一部分列。
请大神赐教。新年快乐
------解决思路----------------------
INSERTED 里面可能会有多条记录的,你只响应了第一条。
------解决思路----------------------
加事務處理就可以了.
沒有用事務,完全可能同時讀取數據.
------解决思路----------------------
沒有用事務,完全可能讀取到相同的數據.
------解决思路----------------------
修正前:你用一条INSERTED记录的逻辑,更新了全部INSERTED对应的记录。怎么会不错。
#2:VISITS的ID不唯一吗?更新条件只要 v.ID = @id 就够了吧。
还有INSERTED是已经插入了VISITS的数据,后一句UPDATE再原样更新VISITS多此一举。
游标循环中@puserid没有清空,@groupid <> 92 的情况下是等同于上一条的数据。