2013-02-19 2 views
4

новый для DBA спасибо за подшипник со мной.MySQL Trigger Insert After with Выбрать запрос из другой таблицы

Обзор: У меня есть группы, подгруппы и пользователи.

  1. Пользователь может быть владельцем группы так должно быть владельцем всех ее подгрупп
  2. Пользователь может быть сотрудником или последователем группы так должно быть сотрудником или последователем всех ее подгрупп
  3. Пользователь может быть сотрудником или повторитель просто подгруппы

Таблицы являются следующие (упрощенно):

Группа (topic_id, название)

Подгруппа (subtopic_id, название, topic_id)

rel_Group (идентификатор_пользователя, topic_id, тип) // Для того, чтобы определить отношение пользователя к группе (владелец, Collaborator или ведомый)

rel_Subgroup (идентификатор_пользователь, subtopic_id, тип) // для того, чтобы определить отношение пользователя подгруппы (Владелец, коллаборатор или ведомый)

Пользователь (user_id)

Я хочу, чтобы создать триггер, когда подгруппа создается, что будет INSERT/UPDATE/DELETE строки в rel_Subgroup так что пользователи, которые владелец, коллаборатора или повторитель на группы с соответственно быть владельцем, Collaborator или последователь в подгруппе

Это ближайший я получил, но я все еще получаю: # 1415 - Не разрешено возвращать набор результатов с триггера.

SQL Query

delimiter // 
create trigger Transfer_Rights_to_Subgroup 
after insert 
on Subgroup 
for each row 
begin 
select user_id,type from rel_Group where rel_Group.topic_id = NEW.topic_id; 
insert into rel_Subgroup VALUES (rel_Group.user_id,NEW.subtopic_id,rel_Group.type); 
END; // 
delimiter ; 

Я надеюсь сортировать вставку и затем выяснить, обновление/удаление.

Любая помощь, высоко ценится!

ТНХ

ответ

11

Успели решить:

DROP TRIGGER IF EXISTS Transfer_Rights_to_Subgroup; 
DELIMITER // 
CREATE TRIGGER Transfer_Rights_to_Subgroup AFTER INSERT ON subgroup 
FOR EACH ROW 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE c1 INT; 
    DECLARE c2 INT; 
    DECLARE cur CURSOR FOR SELECT User_ID,Type FROM rel_group WHERE rel_group.Topic_ID =  NEW.Topic_ID; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 
     ins_loop: LOOP 
      FETCH cur INTO c1,c2; 
      IF done THEN 
       LEAVE ins_loop; 
      END IF; 
      INSERT INTO rel_Subgroup VALUES (c1,NEW.Subtopic_ID,c2); 
     END LOOP; 
    CLOSE cur; 
END; // 
DELIMITER ; 
0

Попробуйте это:

delimiter // 
create trigger Transfer_Rights_to_Subgroup 
after insert 
on Subgroup 
for each row 
begin 
select user_id,type into @userid, @type from group where rel_Group.topic_id = NEW.topic_id; 
insert into rel_Subgroup VALUES (@userid,NEW.subtopic_id,@type); 
END; // 
delimiter ; 
+0

Я думаю, что вы имели в виду: 'выбрать user_id, тип в @userid, @type из' * * rel_Group ** вместо ** группы ** правильно? Пробовал это, и у меня все еще возникает проблема, так как этот выбор возвращает более одного результата: _ «# 1172 - Результат состоял из нескольких строк» ​​_ – Hardane