2012-06-08 58 views
0

超過一排的我有3個表:mysql的觸發器:結果由

模塊:

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

簡介:

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

和權限

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

什麼我想要的是一個觸發器就是填充表的允許每當我插入一個新的模塊...但每個現有的配置文件。

這樣:

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; 

它有效的時候有一個配置文件......當超過一個當我返回「結果包括多個行

我讀到,當你聲明一個變量,支持單個值...您可以爲表格配置文件的每個ID插入記錄?

回答

1

正如您發現的那樣,您只能將標量值分配給一個變量。

要遍歷SELECT查詢的許多結果,您需要使用CURSOR

我個人不喜歡繁瑣的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