Ma question pourrait être simple pour vous, si vous êtes habitué à MySQL. Je suis habitué à SGBD PostgreSQL et j'essaie de traduire un script PL/PgSQL en MySQL.
Voici ce que j'ai
delimiter //
CREATE TRIGGER pgl_new_user
AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE m_user_team_id integer;
SELECT id INTO m_user_team_id FROM user_teams WHERE name = "pgl_reporters";
DECLARE m_projects_id integer;
DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;
OPEN cur;
ins_loop: LOOP
FETCH cur INTO m_projects_id;
IF done THEN
LEAVE ins_loop;
END IF;
INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access)
VALUES (NEW.id, m_projects_id, now(), now(), 20);
END LOOP;
CLOSE cur;
END//
Mais MySQL Workbench me donne une erreur sur DECLARE m_projects_id
. Je ne comprends pas vraiment parce que j'ai la même instruction deux lignes plus haut ...
Des allusions?
EDIT: neubert a résolu cette erreur. Merci.
Mais quand même, quand j'essaie d'insérer dans les utilisateurs:
Error Code: 1329. No data - zero rows fetched, selected, or processed
Avez-vous une idée ? Ou mieux, savez-vous comment je peux obtenir un meilleur message d'erreur?
Tous les DECLARE doivent être au sommet. c'est à dire.
delimiter //
CREATE TRIGGER pgl_new_user
AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE m_user_team_id integer;
DECLARE m_projects_id integer;
DECLARE cur CURSOR FOR SELECT project_id FROM user_team_project_relationships WHERE user_team_id = m_user_team_id;
SET @m_user_team_id := (SELECT id FROM user_teams WHERE name = "pgl_reporters");
OPEN cur;
ins_loop: LOOP
FETCH cur INTO m_projects_id;
IF done THEN
LEAVE ins_loop;
END IF;
INSERT INTO users_projects (user_id, project_id, created_at, updated_at, project_access)
VALUES (NEW.id, m_projects_id, now(), now(), 20);
END LOOP;
CLOSE cur;
END//
En accord avec neubert sur les instructions DECLARE, cela corrigera l’erreur de syntaxe. Mais je vous suggère d'éviter d'utiliser des curseurs d'ouverture, ils peuvent être lents.
Pour votre tâche: utilisez l'instruction INSERT ... SELECT qui vous aidera à copier des données d'une table à une autre à l'aide d'une seule requête.