динамически построить mysql оператор вставки в триггере - PullRequest
0 голосов
/ 05 февраля 2020

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

таблица расписания выглядит следующим образом:

------------------------------
id|project_id|employee_id|hours|
--|----------|-----------|-----|
1 | 11       | 22        |8    |
--------------------------------

таблица часовых графиков выглядит следующим образом:

----------------------------------------
id|ProjectID |ScheduleID |sam|jon|smith|
--|----------|-----------|---|---|-----|
----------------------------------------

таблица сотрудников выглядит следующим образом;

------------
id|Employee|
--|--------|
1 |sam     |
2 |jon     |
22|smith   |
------------

мой оператор триггера выглядит так:

CREATE DEFINER=`root`@`localhost` TRIGGER `projectscheduler`.`schedule_AFTER_INSERT` AFTER INSERT ON `schedule` FOR EACH ROW
SET @EMPNAME=(SELECT Employee FROM employees WHERE id = NEW.employee_id);
BEGIN
    INSERT INTO hourmap (ProjectID, ScheduleID, @EMPNAME)
    VALUES (NEW.project_id, NEW.id, NEW.hours);
END

вот моя попытка хранимой процедуры, однако, все равно не повезло.

USE `projectscheduler`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `projectscheduler`.`schedule_AFTER_INSERT` AFTER INSERT ON `schedule` FOR EACH ROW
BEGIN
    SET @sql = NULL;
    SELECT CONCAT('SELECT Emoloyee FROM employees WHERE id = NEW.id') INTO @sql;
    SET @sql = CONCAT('INSERT INTO hourmap (ProjectID, ScheduleID, `',@sql,'`) VALUES(NEW.project_id, NEW.id, NEW.hours)');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

ERROR 1336: Dynamic SQL is not allowed in stored function or trigger
...