2015-12-04 5 views
0

У меня возникла необходимость создать триггер, чтобы сохранить запись (полученную с помощью JOIN с другой таблицей) в таблице аудита, прежде чем ваши значения будут обновлены.Mysql Trigger query with join other table

Я плохо знаю триггеры, но я создал это.

Возможно ли это сработать?

Ошибка, является:

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

* стол, на котором я применил триггер DESKTOP и я получить имя и фамилию поля относительной записи с объединением на столе пользователей или наоборот.

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'; но триггеры очень сложны при ссылке на таблицу, к которой триггер подключен к триггеру, поэтому наличие подзапроса с «рабочим столом» может вызвать проблемы. Если вы пытаетесь «зарегистрировать» предыдущие значения, используя 'OLD. [Fieldname]' и 'NEW. [Fieldname]', более вероятно, что вы должны использовать. – Uueerdo

+0

@Uueerdo it * будет * вызывать проблемы, в частности проблему «Mutating Table». Дэвид-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

ВЫ ЛУЧШЕ, и я понял что-то сейчас !!!! –