Я ищу помощь по использованию Row_Number в триггере.
Я хотел бы создать триггер, который заполняет таблицу расписаний набором заданий и дней по умолчанию для выполнения задачи. Триггер активируется, когда новый проект добавляется в таблицу ProjectDetails (создается идентификатор проекта), а задачи / дни по умолчанию сохраняются в таблице значений по умолчанию.
Таблица по умолчанию выглядит следующим образом:
ID | Task | DaysForTask
Таблица расписания (которая обновляется триггером) выглядит следующим образом:
ID | ProjectID | Task | DaysForTask | ScheduleOrder | EstimatedDate
Таблица сведений о проекте выглядит следующим образом :
ProjectID | ProjectName | EngagementType
После настройки таблицы расписаний пользователь может ввести дату начала, а отдельная функция рассчитывает EstimatedDate для каждой задачи. EstimatedDate просто рассчитывается как дата предыдущего задания + DaysForTask для текущего задания, поэтому оно основывается на порядке выполнения задания. Однако порядок задач может меняться от проекта к проекту или в середине проекта, и поэтому функция упорядочивает задачи по ScheduleOrder перед возвратом EstimatedDate, и пользователь может при необходимости изменять scheduleOrder. Но когда таблица Schedule впервые создается этим триггером, ScheduleOrder просто подсчитывает количество строк.
Итак, после добавления проекта № 18 в таблицу сведений о проекте таблица расписания должна выглядеть следующим образом:
ProjectID | Task | DaysForTask | ScheduleOrder
18 | TaskA | 5 | 1
18 | TaskB | 10 | 2
Я пытаюсь добавить поле ScheduleOrder с помощью RowNumber. Приведенный ниже код прекрасно работает без Row_Number, но он не работает, когда я включаю в него Row_Number. Я не получаю сообщение об ошибке, но триггер не выполняется, и таблица ProjectDetails не обновляется. Что-то не так с этим?
Delimiter //
CREATE TRIGGER `addProjMilestones` AFTER INSERT ON ProjectDetails
FOR EACH ROW BEGIN
If NOT (new.EngagementType = 'Consulting') THEN
INSERT INTO Schedule (ProjectID,Task,DaysForTask,ScheduleOrder)
SELECT NEW.ProjectID,Task,DaysForTask,ROW_NUMBER() OVER(ORDER BY ID ASC) AS RowNumber
FROM Defaults;
end if;
END;//
delimiter ;