2015-12-04 81 views
0

我有必要创建一个触发器,以便在更新值之前在审计表中保存记录(通过与另一个表的JOIN获得)。Mysql触发查询加入其他表

我不太了解触发器,但我创建了这个。

是否有可能使其工作?报道

错误是:

#1415 - Not allowed to return a result set from a trigger 

*上,我应用了触发器的表是桌面和我得到一个名字和一个连接上表的用户,或者相反相对记录的姓字段。

DELIMITER // 

    CREATE TRIGGER desktop_befUpd 
    BEFORE UPDATE 
     ON desktop FOR EACH ROW 

    BEGIN 

     SELECT 
     Name,Surname,id 
     FROM 
     users 
     JOIN 
     (
     SELECT ID,IDAIFA,brand,model,id_users FROM desktop 
     ) dev ON users.id = dev.id_users; 

     -- Insert record into audit table 
     INSERT INTO data_history 
     (IDAIFA, 
     dt_datetime, 
     Name, 
     Surname 
     ) 
     VALUES 
     (dev.IDAIFA, 
     NOW(), 
     users.Name, 
     users.Surname); 

    END; // 

    DELIMITER ; 
+0

你通常可以得到这样的事情使用单个“INSERT INTO ... SELECT”查询进行工作;但触发器在引用触发器附加在触发器中的表时非常挑剔,因此让子查询使用“desktop”可能会导致问题。如果你想“记录”以前的值,使用'OLD。[fieldname]'和'NEW。[fieldname]'更有可能是你应该使用的。 – Uueerdo

+0

@Uueerdo它会*引发问题,特别是“突变表”问题。大卫88,你可以发布*** ***完整的***记录布局*** ***两张表吗? –

回答

0

由于目前的形式您的选择可能会返回很多行,这是我最好的猜测,你需要什么/正在尝试做的:

DELIMITER // 

CREATE TRIGGER desktop_befUpd 
BEFORE UPDATE ON desktop FOR EACH ROW 
BEGIN 
    INSERT INTO data_history (IDAIFA, dt_datetime, Name, Surname) 
    SELECT OLD.IDAIFA, now(), u.name, u.surname 
    FROM users AS u 
    WHERE u.id = OLD.id_users 
    ; 

END // 

DELIMITER ; 
+0

你是最好的,我现在意识到了一些东西! –