2012-06-08 3 views
0

У меня есть 3 таблицы:Mysql Trigger: Результат состоит из более чем одной строки

Модуль:

id_module | name 
-------------------- 
1    users 
2    roles 
... 

профиля:

id_profile | name 
-------------------- 
1    admin 
2    promoter 

И Разрешение

id | id_profile | id_module | read | write | modify | delete 
--------------------------------------------------------------- 

Что Я хочу, чтобы триггер заполнил таблицу permiss каждый раз, когда я вставляю новый модуль ... но для каждого существующего профиля.

Таким образом:

INSERT INTO `module` (`name`) VALUES 
    ('user'), 
    ('roles'); 

Существующие профили администратора и промоутер стол разрешение будет заполнен так:

id | id_profile | id_module | read | write | modify | delete 
--------------------------------------------------------------- 
1  1    1   0  0  0  0 
2  1    2   0  0  0  0 
3  2    1   0  0  0  0 
4  2    2   0  0  0  0 

Для этого я создал следующий триггер:

CREATE TRIGGER `create_permission` AFTER INSERT ON `module` 
    FOR EACH ROW 
    BEGIN 
    DECLARE `my_profile` INT(11) ; 

    SELECT id_profile INTO `my_profile` FROM profile WHERE state <>3; 

    INSERT INTO `permission` (`id_profile`, `id_module`, `read`, `write`, `modify`, `delete`) VALUES(`my_profile`, NEW.`id_module `,0,0,0,0); 

END; 

Это хорошо работает, когда есть профиль ... когда более чем один, когда я вернусь «Результат состоял из более чем одной строки»

Я читал, что эта проблема возникает, когда вы объявляете переменную, которая поддерживает одно значение ... Вы можете вставлять записи для каждого идентификатора профиля таблицы?

ответ

1

Как вы узнали, вы можете присваивать только скалярные значения переменной.

Чтобы повторить множество результатов запроса SELECT, вам необходимо использовать CURSOR.

I personnaly не нравится громоздкий CURSOR синтаксис. В вашем конкретном случае, я бы посоветовал более простой INSERT INTO...SELECT трюк:

INSERT INTO permission (id_profile, id_module, read, write, modify, delete) 
SELECT id_profile, NEW.id_module,0,0,0,0 FROM profile WHERE state <> 3; 
+0

Привет, это очень интересно и просто ваше решение. Но перед вставкой можно сделать оператор if? Я просто хочу знать, будет ли id_profile «1» вставлен в разрешения 1,1,1,1 ... и если id_profile - это другое число, вставьте 0,0,0,0. Возможно ли это в одном предложении или его можно решить с помощью курсора? – csotelo

Смежные вопросы