2015-12-04 102 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

你是最好的,我現在意識到了一些東西! –